|
06/09/2008
Experto
|
Lo que hago con el MsFlexGrid es "simular" que está escribiendo sobre el grid, pero en realidad coloco un Frame que contiene varios TextBox para que parezca un renglón.
Este código es del MsFlexGrid para hacerlo
Private Sub fgdPedidos_Click()
If fgdPedidos.Col = lColumnas.ASurtir And fgdPedidos.Row > 0 And fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Editar) = 1 Then
txtCantidad.Height = fgdPedidos.RowHeight(fgdPedidos.Row)
txtCantidad.Width = fgdPedidos.ColWidth(fgdPedidos.Col)
txtCantidad.Left = fgdPedidos.ColPos(fgdPedidos.Col) + SSTab1.Left + fgdPedidos.Left + 35
txtCantidad.Top = fgdPedidos.RowPos(fgdPedidos.Row) + SSTab1.Top + fgdPedidos.Top + 35
fgdPedidos.HighLight = flexHighlightNever
If Val(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.ASurtir)) = 0 Then
txtCantidad = ""
Else
txtCantidad.Text = fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.ASurtir)
End If
txtCantidad.Visible = True
txtCantidad.SetFocus
End If
End Sub
Private Sub fgdPedidos_KeyPress(KeyAscii As Integer)
If KeyAscii = vbKeyReturn Then
fgdPedidos_Click
If txtCantidad = "0" Then
txtCantidad = ""
End If
Else
If (Chr(KeyAscii) >= "0" And Chr(KeyAscii) <= "9") Then
fgdPedidos_Click
txtCantidad = Chr(KeyAscii)
End If
End If
End Sub
Private Sub fgdPedidos_Scroll()
If txtCantidad.Visible Then
If Val(txtCantidad) = 0 Then
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.ASurtir) = ""
Else
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.ASurtir) = Val(txtCantidad)
End If
End If
fgdPedidos.SetFocus
txtCantidad.Visible = False
End Sub
Luego en cada uno de los TextBox que tengas, pones el código necesario para pasar el contenido de ese TextBox a la celda del grid correspondiente
Por ejemplo, aqui paso el contenido de un TextBox(txtCandidad) a una de las celdas del MsFlexGrid.
Private Sub txtCantidad_KeyPress(KeyAscii As Integer)
Dim sIVA As Double
'lCodigoAscii = KeyAscii
If KeyAscii = vbKeyReturn Then
KeyAscii = 0
If Val(txtCantidad) > 0 Then
If Val(txtCantidad) + Val(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Entregada)) > Val(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Pedida)) Then
Beep
MsgBox "Está excediendo la cantidad de unidades pedidas para el producto...", vbCritical, "Mensaje de Error"
Exit Sub
End If
Else
txtCantidad = 0
'Beep
'MsgBox "La cantidad no es válida...", vbCritical, "Mensaje de Error"
'Exit Sub
End If
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.ASurtir) = Val(txtCantidad)
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Importe) = Format(Val(txtCantidad) * CCur(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Precio)), "Currency")
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.IVA) = Format(CCur(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Importe)) * Val(lPorcIVA), "Currency")
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Total) = Format(CCur(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Importe)) + CCur(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.IVA)), "Currency")
SumaTotal
If fgdPedidos.Row + 1 <= (fgdPedidos.Rows - 1) Then
fgdPedidos.Row = fgdPedidos.Row + 1
End If
fgdPedidos.SetFocus
txtCantidad.Visible = False
Else
If KeyAscii = vbKeyEscape Then
txtCantidad.Visible = False
fgdPedidos.SetFocus
End If
End If
End Sub
Private Sub txtCantidad_Validate(Cancel As Boolean)
If lCodigoAscii = vbKeyEscape Then
lCodigoAscii = 0
Else
If Val(txtCantidad) > 0 Then
If Val(txtCantidad) + Val(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Entregada)) > Val(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Pedida)) Then
Beep
MsgBox "Está excediendo la cantidad de unidades pedidas para el producto...", vbCritical, "Mensaje de Error"
Cancel = True
Exit Sub
End If
Else
txtCantidad = 0
'Beep
'MsgBox "La cantidad no es válida...", vbCritical, "Mensaje de Error"
'Cancel = True
'Exit Sub
End If
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.ASurtir) = Val(txtCantidad)
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Importe) = Format(Val(txtCantidad) * CCur(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Precio)), "Currency")
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.IVA) = Format(CCur(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Importe)) * Val(lPorcIVA), "Currency")
fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Total) = Format(CCur(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.Importe)) + CCur(fgdPedidos.TextMatrix(fgdPedidos.Row, lColumnas.IVA)), "Currency")
SumaTotal
End If
fgdPedidos.SetFocus
txtCantidad.Visible = False
End Sub
Sobre usar temporales es muy extenso de explicar pero trataré de darte una idea
La idea es la siguiente: Tener 2 tablas, una para el encabezado de las facturas y otro para su detalle. Cuando el usuario entre a este formulario para capturar una factura se generarán registros que guardarán lo que capture y si hace clic en el botón de "Aceptar" o "Imprimir", entonces, esos registros temporales pasarán a grabarse a las tablas "en firme" digamos, tanto de "encabezado" como de "detalle"
Supongamos que tienes una tabla llamada "Temporal01" para el encabezado de las facturas con todos los datos de la factura(Num. Factura, fecha, cliente, etc.) y otra tabla llamada "Temporal02" para todos los artículos de dicha factura(o detalle)
Lo mas común al facturar es primero capturar un pedido o una orden de compra con todos los datos del cliente y los artículos que se van a facturar, los cuales pueden ser modificados antes de facturar.
Suponiendo que ya tienes capturado el pedido debes hacer esto
1. Mostrar el formulario para imprimir. Los campos y el grid se encuentran en blanco.
2. Tener un TextBox para que el usuario ingrese el número de pedido que quiere facturar.
3. En la tabla temporal de encabezado, calcular el número máximo de un campo de identificación de registros (por ejemplo Id) (Select Max(Id) as FolioActual From Temporal01)
4. Incrementarle 1
5. Agregar un registro en la tabla de encabezado con el número de identificación recién calculado.
6. Pasar los datos de las tablas de pedidos y detalle de pedidos a las tablas temporales Temporal01 y Temporal02 respectivamente.
7. Mostrar los datos del encabezado en el formulario y para el grid, establecer en el AdoDataControl en su propiedad RecordSource: Adodc1.RecordSource = "Select * From Temporal02 Where Id = " & FolioSiguiente ' Suponiendo que FolioSiguiente tiene el número de identificación del registro temporal recién creado.
8. Tener unos CommandButton para Agregar, modificar, o eliminar el o los artículos del pedido y/o sus cantidades.
9. Esta operación se realiza en otro formulario. Por ejemplo, si hace clic en el botón de Agrega, muestras un formulario para agregar uno de los artículos, con su código, cantidad, etc. Si hace clic en aceptar(en ese otro formulario) se agrega un registro a la tabla Temporal02.
10. Una vez que el usuario ha completado la factura a imprimir y pulsa el botón "Aceptar" o "Imprimir" según quiera llamársele, se envían a impresión los datos de los registros habidos en las tablas Temporal01 y Temporal02 de acuerdo al Folio calculado.
11. Se pregunta si se imprimió bien la factura y de ser así dichos datos se agregan a las tablas de "FacturaEncabezado"(los datos de Temporal01) y "FacturaDetalle"(los datos de Temporal02)
12. Se eliminan los datos en los temporales de la factura recién impresa. Por ejemplo, "Delete From Temporal01 Where Id = 4871" (Si la tabla encabezado Temporal01 está relacionada con la tabla detalle Temporal02 de manera que elimine los registros de la tabla de detalle al eliminarse el del encabezado, no será necesario eliminarlos por separado, de lo contrario debe escribirse una sentencia para eliminar los de detalle "Delete From Temporal02 Where Id = 4871")
13. Se limpian los campos en el formulario y para que el grid no muestre nada se le da un valor que no exista hasta que nuevamente deba mostrar datos válidos, por ejemplo Adodc1.RecordSource = "Select * From Temporal02 Where Id = -10"
Como verás es bastante complejo explicarlo, si tienes una duda mas específica dímelo
|