FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Ayuda con SQL
Posts: 0
Joined: unknown
Ayuda con SQL
Posted: Wed Mar 18, 2020 01:23 PM
Hola gente, buen d铆a, hace tiempo que trabajo en algunos sistemas con SQL.

Me paso algo muy raro, en un sistema en la funci贸n cobranza, se ingreso una cobranza de varios documentos y actualiz贸 solo algunas tablas y una no hizo nada, lo extra帽o es que la que no actualiz贸 est谩 intercalada con la actualizaci贸n de las dem谩s tablas y no dio error alguno.

UPDATE licita SET saldo = saldo - 17400.00, ult_pago = 18/03/2020 where licita = 30155
INSERT INTO Pagos ([familia],[Factura],[Fecha],[Recibo],[Importe],[Fecven],[Fecpago],[Puesto],[TIPO],[descu], [observa], saldo, saldoafa, interescalculado ) VALUES ( 34, 30155, '18/03/2020', 3390, 17400.00, '18/03/2020', '18/03/2020', 1, 'N', 0.00,' ',0,0, 0.00 )
UPDATE licita SET saldo = saldo - 17400.00, ult_pago = 18/03/2020 where licita = 30156
INSERT INTO Pagos ([familia],[Factura],[Fecha],[Recibo],[Importe],[Fecven],[Fecpago],[Puesto],[TIPO],[descu], [observa], saldo, saldoafa, interescalculado ) VALUES ( 34, 30156, '18/03/2020', 3390, 17400.00, '18/03/2020', '18/03/2020', 1, 'N', 0.00,' ',0,0, 0.00 )
UPDATE licita SET saldo = saldo - 17400.00, ult_pago = 18/03/2020 where licita = 31029
INSERT INTO Pagos ([familia],[Factura],[Fecha],[Recibo],[Importe],[Fecven],[Fecpago],[Puesto],[TIPO],[descu], [observa], saldo, saldoafa, interescalculado ) VALUES ( 34, 31029, '18/03/2020', 3390, 17400.00, '18/03/2020', '18/03/2020', 1, 'N', 0.00,' ',0,0, 0.00 )
UPDATE licita SET saldo = saldo - 17400.00, ult_pago = 18/03/2020 where licita = 31030
INSERT INTO Pagos ([familia],[Factura],[Fecha],[Recibo],[Importe],[Fecven],[Fecpago],[Puesto],[TIPO],[descu], [observa], saldo, saldoafa, interescalculado ) VALUES ( 34, 31030, '18/03/2020', 3390, 17400.00, '18/03/2020', '18/03/2020', 1, 'N', 0.00,' ',0,0, 0.00 )
UPDATE licita SET saldo = saldo - 156600.00, ult_pago = 18/03/2020 where licita = 31258
INSERT INTO Pagos ([familia],[Factura],[Fecha],[Recibo],[Importe],[Fecven],[Fecpago],[Puesto],[TIPO],[descu], [observa], saldo, saldoafa, interescalculado ) VALUES ( 34, 31258, '18/03/2020', 3390, 156600.00, '18/03/2020', '18/03/2020', 1, 'N', -16700.00,' ',0,0, -16700.00 )
UPDATE licita SET saldo = saldo - 156600.00, ult_pago = 18/03/2020 where licita = 31259
INSERT INTO Pagos ([familia],[Factura],[Fecha],[Recibo],[Importe],[Fecven],[Fecpago],[Puesto],[TIPO],[descu], [observa], saldo, saldoafa, interescalculado ) VALUES ( 34, 31259, '18/03/2020', 3390, 156600.00, '18/03/2020', '18/03/2020', 1, 'N', -16700.00,' ',0,0, -16700.00 )
INSERT INTO Mov_ven ([Fecha],[Puesto],[Numero],[Descri],[Factura],pagos,[Forpago],[Vendedor]) VALUES ('18/03/2020',2, 3390,'Iturrioz Fermin ', 349400.00,0,1,'')
UPDATE Numdoc SET recibo = 3390, nroorden = 7 where numero = 2

La tabla que no actualiz贸 es Pagos.

Lo hago con try catch, mando el string con todas las sentencias para atajar errores y no actualice nada.

Adem谩s lo volv铆 a generar sin tocar nada y actualiz贸 perfecto.

Obvio que esta funci贸n se usa a diario y nunca tuvimos este error.

Saludos
Jorge.
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Ayuda con SQL
Posted: Wed Mar 18, 2020 10:17 PM

Jorge buenas tardes,

Puedes postear algo de c贸digo en donde haces la inserci贸n de los registros?

Y por otro lado est谩n definidos as铆 los campos "[Factura]" incluyendo los corchetes planos ?

Saludos
LEANDRO AREVALO
Bogot谩 (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: Ayuda con SQL
Posted: Fri Mar 20, 2020 02:08 PM
leandro wrote:Jorge buenas tardes,

Puedes postear algo de c贸digo en donde haces la inserci贸n de los registros?

Y por otro lado est谩n definidos as铆 los campos "[Factura]" incluyendo los corchetes planos ?


Just like we use ` to quote field names in MySql ( eg `fieldname` ), we use [ ] in DBF, Access, MSSQL. ( eg: [fieldname] ).
Regards



G. N. Rao.

Hyderabad, India
Posts: 0
Joined: unknown
Re: Ayuda con SQL
Posted: Wed Apr 01, 2020 01:14 PM
Esta es la rutina donde genero los registros:


function generoreci()
xtotal = xefectivo + xtotche + ximpretiva + ximpretgan + ximpretrg + ximpretibr + acuenta
if xtotal = 0
msginfo( "Monto abonado en cero" )
retu .f.
endif

wtxt = "errorecib.txt"
ferase( wtxt )
cHande = FCREATE ( wtxt )

cSQLNum := "SELECT * FROM numdoc where numero = " + str( xemprevige )
oRS1num := CargaRecordSet( cSQLnum, CadenaCon )

IF oRS1num = nil
Msginfo( "problemas, no puedo leer numdoc" )
retu .t.
endif
if acuenta = 0
xrecibo := oRS1num:Fields( "recibo" ):value + 1
endif


val_fam( xfamilia )

if limpreci
imprireci()
* retu .f.
endif

xnombre = xpadre
sele au_reci
go top
i = 1
* ? xdescu
copias = 1

if ximpinteres < 0
x1impabon := xtotal + imp_nc + ( ximpinteres * - 1 ) + acuenta
else
x1impabon := xtotal + imp_nc + acuenta - ximpinteres
endif

xsaldo = 0
SQLMVen = ""
if xfactura = 0
else
do while i <= len( tfactura )
if tfactura[ i, 1 ] = "*"
jk = val( tfactura[ i, 3 ] )
if tfactura[ i, 2 ] $ "N NCM "
wrecset = oRS1RecLic
wrec = "licita"
wfac = "licita"
else
wrecset = oRS1Recvta
wrec = "ventas"
wfac = "factura"
endif
wtipo = "N"
xpuesto = val( tfactura[ i, 8 ] )
if tfactura[ i, 2 ] = "AC"
xsaldo = val( tfactura[ i, 10 ] )
*x1impabon = x1impabon - val( tfactura[ i, 10 ] )
wtipo = "X"
ws = 0
*SQLMVen = SQLMVen + "UPDATE pagos SET saldoafa = 0, cancelado = 0, importe = " + str( val( tfactura[ i, 10 ] ), 10, 2 ) + " where id = " + str(tregistro[ x ]) + chr( 13 ) + chr( 10 )
SQLMVen = SQLMVen + "UPDATE pagos SET saldoafa = saldoafa + " + str(val( tfactura[ i, 10 ] ),10,2) + ", cancelado = 9999999 where id = " + str(tregistro[ i ]) + chr( 13 ) + chr( 10 )
else
wrecset:AbsolutePosition = tregistro[ i ]

//wrecset:find("factura"=jk ) //oRs:Find( "file_num = '"+cFIND+"'" )
if tfactura[ i, 2 ] $ "CCNC"
xsaldo := wrecset:Fields( "saldo" ):value
SQLMVen = SQLMVen + "UPDATE " + wrec + " SET saldo = 0, ult_pago = '" + dtoc( xfecha ) + "' where " + wfac + " = " + str( jk ) + chr( 13 ) + chr( 10 )
else
if val( tfactura[ i, 10 ] ) < x1impabon
xsaldo = val( tfactura[ i, 10 ] )
x1impabon = x1impabon - val( tfactura[ i, 10 ] )
ws = val( tfactura[ i, 10 ] )
else
xsaldo = x1impabon
ws = x1impabon
x1impabon = 0
endif

SQLMVen = SQLMVen + "UPDATE " + wrec + " SET saldo = saldo - " + str( ws, 10, 2 ) + ", ult_pago = " + dtoc( xfecha ) + " where " + wfac + " = " + str( jk ) + chr( 13 ) + chr( 10 )
ENDIF
* endif
SQLMVen = SQLMVen + "INSERT INTO Pagos ([familia],[Factura],[Fecha],[Recibo],[Importe],[Fecven],[Fecpago],[Puesto],[TIPO],[descu], [observa], saldo, saldoafa, interescalculado ) VALUES (" + ;
str( xfamilia , 8, 0 ) + ", " + str( jk, 8, 0 ) + ", '" + dtoc( xfecha ) ;
+ "', " + str( xrecibo, 8, 0 ) + ", " + str( xsaldo, 10, 2 ) + ", '" + dtoc( xfecha ) + "', '" + dtoc( xfecha ) + "', " + str( xpuesto, 4, 0 ) + ", " + "'"+wtipo+"'," + tfactura[ i, 9 ] + ",'" + xobserva + "',0,0," + tfactura[ i, 9 ] + " )" + chr( 13 ) + chr( 10 )
endif
endif

i = i + 1
enddo
endif

jorden = 0
hh = 1

sele au_reci
go top
do while .not. eof()
if cuenta <> 0
wque = "mov_bco"
SQLMVen = SQLMVen + "INSERT INTO " + wque + " ([Fecha],[Puesto],[Cuit_che],[Numero],[Descri],[Factura],pagos,[Num_che],[Fec_che],[Banco],[Titular],[Forpago],[Vendedor], [orden], cuenta, esinter) VALUES ('" + dtoc( xfecha ) + "'," + str( xemprevige, 1, 0 ) ;
+ ",'" + au_reci->cuit_che + "'," + str( xrecibo, 8, 0 ) + ",'" + alltrim( substr( xnombre, 1, 45 ) ) + "'," + str( au_reci->importe, 10, 2 ) + ",0," + str( au_reci->chenro, 8, 0 ) + ",'" + dtoc( au_reci->fecche ) + "','" + substr( au_reci->banco, 1, 15 ) + "','" + alltrim( substr( au_reci->titular, 1, 30 ) ) + "',2,'" + alltrim( xnombreven ) + "'," + str( au_reci->orden, 8, 0 ) + "," + str( au_reci->cuenta, 10, 0 ) + ", 'S')" + chr( 13 ) + chr( 10 )
else
wque = "mov_ven"
SQLMVen = SQLMVen + "INSERT INTO " + wque + " ([Fecha],[Puesto],[Cuit_che],[Numero],[Descri],[Factura],pagos,[Num_che],[Fec_che],[Banco],[Titular],[Forpago],[Vendedor], [orden]) VALUES ('" + dtoc( xfecha ) + "'," + str( xemprevige, 1, 0 ) ;
+ ",'" + au_reci->cuit_che + "'," + str( xrecibo, 8, 0 ) + ",'" + alltrim( substr( xnombre, 1, 45 ) ) + "'," + str( au_reci->importe, 10, 2 ) + ",0," + str( au_reci->chenro, 8, 0 ) + ",'" + dtoc( au_reci->fecche ) + "','" + substr( au_reci->banco, 1, 15 ) + "','" + alltrim( substr( au_reci->titular, 1, 30 ) ) + "',2,'" + alltrim( xnombreven ) + "'," + str( au_reci->orden, 8, 0 ) + ")" + chr( 13 ) + chr( 10 )
endif
sele au_reci
skip
enddo

if xefectivo <> 0
SQLMVen = SQLMVen + "INSERT INTO Mov_ven ([Fecha],[Puesto],[Numero],[Descri],[Factura],pagos,[Forpago],[Vendedor]) VALUES ('" + dtoc( xfecha ) + "'," + str( xemprevige, 1, 0 ) ;
+ "," + str( xrecibo, 8, 0 ) + ",'" + substr( xnombre, 1, 45 ) + "'," + str( xefectivo, 10, 2 ) + ",0,1,'" + xnombreven + "')" + chr( 13 ) + chr( 10 )
endif

if ximpinteres < 0
if x1impabon > 0 // - ximpdescu
SQLMVen = SQLMVen + "INSERT INTO Pagos ([familia],[Factura],[Fecha],[Recibo],[Importe],[Fecven],[Fecpago],[Puesto],[TIPO], saldo, saldoafa, InteresCalculado, [observa] ) VALUES (" + str( xfamilia , 8, 0 ) + ", 0, '" + dtoc( xfecha ) ;
+ "', " + str( xrecibo, 8, 0 ) + ", " + str( x1impabon, 10, 2 ) + ", '" + dtoc( xfecha ) + "', '" + dtoc( xfecha ) + "', 1, " + "'N', 0, 0, 0,'" + xobserva + "' )" + chr( 13 ) + chr( 10 )
endif
else
if x1impabon > 0 //- ximpinteres // - ximpdescu
SQLMVen = SQLMVen + "INSERT INTO Pagos ([familia],[Factura],[Fecha],[Recibo],[Importe],[Fecven],[Fecpago],[Puesto],[TIPO], saldo, saldoafa, InteresCalculado, [observa] ) VALUES (" + str( xfamilia , 8, 0 ) + ", 0, '" + dtoc( xfecha ) ;
+ "', " + str( xrecibo, 8, 0 ) + ", " + str( x1impabon, 10, 2 ) + ", '" + dtoc( xfecha ) + "', '" + dtoc( xfecha ) + "', 1, " + "'N', 0, 0, 0,'" + xobserva + "' )" + chr( 13 ) + chr( 10 )
endif
endif

if ximpretiva <> 0
SQLMVen = SQLMVen + "INSERT INTO Compret ([Cliente],[Comproba],[Tipo],[Fecha],[Recibo],[Importe],[Fecpago]) VALUES " + ;
" ( " + str( xfamilia, 8, 0 ) + ", " + str( xcomretiva, 12, 0 ) + ", " + "'IVA'" + ", '" + dtoc( xfecha ) + "', " + str( xrecibo, 8, 0 ) + ", " + str( ximpretiva, 10, 2 ) + ", '" + dtoc( xfecha ) + "')" + chr( 13 ) + chr( 10 )
endif
if ximpretgan <> 0

SQLMVen = SQLMVen + "INSERT INTO Compret ([Cliente],[Comproba],[Tipo],[Fecha],[Recibo],[Importe],[Fecpago]) VALUES " + ;
" ( " + str( xfamilia, 8, 0 ) + ", " + str( xcomretgan, 12, 0 ) + ", " + "'GAN'" + ", '" + dtoc( xfecha ) + "', " + str( xrecibo, 8, 0 ) + ", " + str( ximpretgan, 10, 2 ) + ", '" + dtoc( xfecha ) + "')" + chr( 13 ) + chr( 10 )
endif
if ximpretrg <> 0
SQLMVen = SQLMVen + "INSERT INTO Compret ([Cliente],[Comproba],[Tipo],[Fecha],[Recibo],[Importe],[Fecpago]) VALUES " + ;
" ( " + str( xfamilia, 8, 0 ) + ", " + str( xcomretrg, 12, 0 ) + ", " + "'RG'" + ", '" + dtoc( xfecha ) + "', " + str( xrecibo, 8, 0 ) + ", " + str( ximpretrg, 10, 2 ) + ", '" + dtoc( xfecha ) + "')" + chr( 13 ) + chr( 10 )
endif
if ximpretibr <> 0
SQLMVen = SQLMVen + "INSERT INTO Compret ([Cliente],[Comproba],[Tipo],[Fecha],[Recibo],[Importe],[Fecpago]) VALUES " + ;
" ( " + str( xfamilia, 8, 0 ) + ", " + str( xcomretibr, 12, 0 ) + ", " + "'IBR'" + ", '" + dtoc( xfecha ) + "', " + str( xrecibo, 8, 0 ) + ", " + str( ximpretibr, 10, 2 ) + ", '" + dtoc( xfecha ) + "')" + chr( 13 ) + chr( 10 )
endif

SQLMVen = SQLMVen + "UPDATE Numdoc SET recibo = " + str( xrecibo, 8, 0 ) + ", nroorden = " + str( xorden, 8, 0 ) + " where numero = " + str( xemprevige ) + chr( 13 ) + chr( 10 )
TRY
oCon:Execute( sqlMVen )
oCon:Close() ; Catch oErr
msginfo("Error al grabar el recibo "+sqlmven)
FWrite ( cHande, SQLMVen + chr( 13 ) + chr( 10 )+ oErr )
END TRY

FClose ( cHande )


Los corchetes est谩n porque corrijo las sentencias en sql managment studio, pero reitero los raro es que anda bien sin problemas, hasta ahora detecte que fallo una sola ves (espero).

El problema es como detectar porque falla.

Saludos
Jorge.
Posts: 492
Joined: Wed Nov 16, 2005 12:03 PM
Re: Ayuda con SQL
Posted: Wed Apr 01, 2020 10:41 PM

Saludos
La tabla tiene integridad referencial con otras tablas?
Reglas de Triggers

EN algunas ocasiones, aplico:

oBd:EXECUTE("SET FOREIGN_KEY_CHECKS = 0") // Si es MySQL

Posts: 492
Joined: Wed Nov 16, 2005 12:03 PM
Re: Ayuda con SQL
Posted: Wed Apr 01, 2020 10:48 PM

Jorge
Saludos, sin queren presione submit

Cual gestor de BD estas utilizando
En mi caso todas las sentencias las genero en una variable de texto y las grabo en disco MEMOWRIT("run.sql",cSql)

oDb:Execute(cSql)

Dependiendo de la clase de utilices, podras optener el numero o texto del error, en mi caso uso EAGLE con cError:=oDb:oConnect:oError:GetError()

Si tienes tablas con integridad referencial mediante INNO DB

Podras desactivar la integridad referencial mediante

oDb:EXECUTE("SET FOREIGN_KEY_CHECKS = 0")
oDb:EXECUTE(cSql)
oDb:EXECUTE("SET FOREIGN_KEY_CHECKS =1") // Activar la Integridad

Si algunos colegas requieren que les apoye o capacite con MySQL, estoy a su disposicion mediante video capacitacion, tengo un sistema ERP con MySQL y SQL Server, en ambos casos con integridad, vistas, disparadores, funciones y afines.

Continue the discussion