Instrucciones para marcar cantidades con decimales y cargar formularios en Microsoft Access

Espero que te encuentres bien, después de algún tiempo, vuelvo con más preguntas, en esta ocasión:
a)Cual es la mejor forma para que me una caja de texto me aparezca una cantidad de dinero con decimales y con el signo de una determinada moneda (lo he intentado con el maskEditBox, pero los decimales no me funcionan, aún revisando la propiedad de format y dataformat, no me los guarda en la base de datos access)lo que quiero es que la cantidad aparezca de esta forma: ¢250,25, al realizar la consulta si me muestra los decimales (entrados por access), pero al guardar yo el resultado dentro de la base, me lo guarda sin los decimales, y lo que guarda es: a) quita los decimales b)lo convierte todo a un solo número
b)Como puedo hacer para que al cargar un form, el datagrid me aparezca en blanco y después de que la persona ha introducido la información, pueda salvar el (los) registro(s) en una base de datos (tipo programas de facturación que se usan en las ferreterías), y al volver a cargar el form, el datagrid vuelva a estar en blanco
c)En caso de poder conseguir el truedbgrid (¿no sabes donde lo puedo conseguir?)¿Se hace el mismo procedimiento anterior para lograr lo que quiero?
Gracias de antemano por tus respuestas, la verdad me servirán, en el último de los casos, sino como solución tal vez como mi guía. +
Luis.

1 Respuesta

Respuesta
1
Aquí están las respuestas
a) La razón por la que está tomando solo enteros es porque el formato para decimales de Windows es un punto. Por lo tanto cuando escribes 250,25 solo toma como válido el 250 al considerar la coma(,) como un texto, si escribes 250.25 verás la diferencia. Para cambiar esto tendrías que modificar el formato de números en el panel de control y la configuración regional pero esto afectaría a todos los demás programas instalados en tu PC. De otra forma tendrías que hacerlo "a pie", es decir, recorrer la cadena de texto del control y uno por uno editarlo(bastante trabajo)
b) Aquí hay 2 opciones. 1. Utilizar el MsFlexGrid que es un control que te permite llenar las celdas del grid de forma manual, solo que hay que hacer todo el trabajo celda por celda. Lo que también puedes hacer es tener una tabla temporal para el encabezado y el detalle y que esté enlazado a un AdoDataControl y de esa manera lo refleje en el grid. Por ejemplo, si es un temporal, cuando el usuario quiera agregar un nuevo encabezado de registro, calculas un número de identificación para el encabezado y vas agregando registros a dicho número hasta que finalice su captura e impresión(en su caso). Después, los registros temporales los pasas a las tablas en firme y borras los temporales. Para limpiar el grid, seleccionas un nuevo número de indentificación.
c) Sobre el TrueDBGrid, efectivamente no te afecta en nada el cambiarlo por el DataGrid y lo puedes conseguir como versión "Demo" en http://www.componentone.com
Si tienes alguna duda dímelo
Oye, pues muchas gracias a verdad, es que ya casi acabo con mis dudas y tus respuestas son muy buenas, espero puedas aclararme un poco más la segundal; en las otras como diría ALF "... No hay problema"
Tengo entendido que con e MsFlexGrid solo se puede visualizar información pero no insertarla, ¿es esto cierto? , si no lo es, ¿Qué diferencia hay con el datagrid o el dbgrid o aún más con el truedbgrid?, por ultimo podrías enviarme un ejemplo de como hacer lo que me dijiste o explicármelo de otra forma ya que no lo entendí, lo que quiero es que al llenar el grid no tenga que escribir la llave principal por cada registro, sino que ella lo tome de un campo de texto al insertar un nuevo registro, ah! Y sí, el grid lo tengo unido al adodc,
Gracias.
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, aquí 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 más 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 más específica dímelo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas