* Consultas Sql
* Facturas (Cursor Vacio)
TEXT TO _sql_facturas TEXTMERGE PRETEXT 7 NOSHOW
SELECT
, facturas.idcliente
, facturas.idmoneda
, facturas.serie
, facturas.folio
, facturas.fecha
, clientes.cliente
, monedas.moneda
from facturas
inner join clientes
inner join monedas
where 2 = 1
ENDTEXT
* Detalles de Facturas (Cursor Vacio)
TEXT TO _sql_facturas_detalles TEXTMERGE PRETEXT 7 NOSHOW
SELECT
, facturas_detalles.idfactura
, facturas_detalles.idconcepto
, facturas_detalles.cantidad
, facturas_detalles.descripcion
, facturas_detalles.precio_unitario
, facturas_detalles.descuento
, facturas_detalles.importe
, ifnull(conceptos.concepto, '') as concepto
from facturas_detalles
left join conceptos
where 2 = 1
ENDTEXT
* Observaciones de Facturas (Cursor Vacio)
TEXT TO _sql_facturas_observaciones TEXTMERGE PRETEXT 7 NOSHOW
SELECT
, facturas_observaciones.idfactura
, facturas_observaciones.idprioridad
, facturas_observaciones.observacion
, facturas_observaciones.fecha
, prioridades.prioridad
from facturas_observaciones
inner join prioridades
where 2 = 1
ENDTEXT
* Obtenemos los catalogo necesarios para el formulario
* Clientes
odb.Sql("Select * from clientes", "clientes")
* Monedas
odb.Sql("Select * from monedas", "monedas")
* Conceptos
odb.Sql("Select * from conceptos", "conceptos")
* prioridades
odb.Sql("Select * from prioridades", "prioridades")
* ect, etc.
* Nota: NUNCA usar Select *, lo pongo para ejemplo
* Obtenemos los cursores que seran administrados por FoxyDb
* tabla Principal
odb.Query(_sql_facturas, "facturas")
* Preparamos para editar
odb.CursorEdit("facturas")
* tabla Secundaria Detalles de Factura
odb.Query(_sql_facturas_detalles, "facturas_detalles")
* Preparamos para editar
odb.CursorEdit("facturas_detalles")
* tabla secundaria Observaciones de Factura
odb.Query(_sql_facturas_observaciones, "facturas_observaciones")
* Preparamos para editar
odb.CursorEdit("facturas_observaciones")
* Agregamos un Registro
* SELECT facturas
* APPEND BLANK
* Se puede usar Insert Into
INSERT INTO facturas (idcliente, cliente, idmoneda, moneda, fecha) ;
* Agregamos unas Observaciones
INSERT INTO facturas_observaciones (idfactura, idprioridad, observacion, fecha) ;
INSERT INTO facturas_observaciones (idfactura, idprioridad, observacion, fecha) ;
* Agregamos Detalles de Facturas
INSERT INTO facturas_detalles (idfactura, idconcepto, concepto, cantidad, descripcion, precio_unitario, descuento, importe) ;
INSERT INTO facturas_detalles (idfactura, idconcepto, concepto, cantidad, descripcion, precio_unitario, descuento, importe) ;
INSERT INTO facturas_detalles (idfactura, idconcepto, concepto, cantidad, descripcion, precio_unitario, descuento, importe) ;
* Vamos a Guardar
* Revisar si hay cambios en algún cursor
If odb.Changes()
LOCAL _idRegistroNuevo as Integer, _hayCambios as Boolean, _errorSql as Boolean
_idRegistroNuevo = 0
_hayCambios = .f.
_errorSql = .f.
* Tabla Principal
if odb.CursorChanges("facturas")
_hayCambios = .t.
* Obtener Folio unico de Factura
odb.Code("facturas_folios","folio")
replace facturas.folio WITH PADL(odb.id_Code, 10, '0') IN facturas
ENDIF
IF odb.update(facturas, .t.)
_idRegistroNuevo = odb.id_last
ELSE
* Hay un error
_errorSql = .t.
ENDIF
ENDIF
* Tabla de Detalles de Facturas
if odb.CursorChanges("facturas_detalles") AND _errorSql = .f.
_hayCambios = .t.
* Verificar si es registro nuevo el Principal
IF _idRegistroNuevo <> 0
* Asignar Ultimo ID a los registros del detalle de facturas
replace facturas_detalles.idfactura WITH _idRegistroNuevo ALL IN facturas_detalles
ENDIF
IF odb.update(facturas_detalles)
* Vamos bien!!!
ELSE
* Hay un error
_errorSql = .t.
ENDIF
ENDIF
* Tabla de Observaciones de Facturas
if odb.CursorChanges("facturas_observaciones") AND _errorSql = .f.
_hayCambios = .t.
* Verificar si es registro nuevo el Principal
IF _idRegistroNuevo <> 0
* Asignar Ultimo ID a los registros del detalle de facturas
replace facturas_observaciones.idfactura WITH _idRegistroNuevo ALL IN facturas_observaciones
ENDIF
IF odb.update(facturas_observaciones)
* Vamos bien!!!
ELSE
* Hay un error
_errorSql = .t.
ENDIF
ENDIF
* Guardar Cambios
IF _errorSql = .t.
* Algo salio mal
odb.Rollback()
ELSE
* Veamos si hay cambios para guardar
IF _hayCambios = .t.
if odb.Commit()
MessageBox("Perfecto!!, Datos Guardados")
else
odb.RollBack()
MessageBox("No se pudieron guardar los datos")
endif
ENDIF
ENDIF
else
* No se ha hecho ningún cambio
endif