In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Error TWebDataSource
Error TWebDataSource
Estoy subiendo info a travez de TWebDataSource y uso el TSQLQuery para afectar datos, funciona bien, pero estoy subiendo mas de 10mil datos de una DBF a una BBDD MySql, y al llegar al 10mil, me marca error por memoria.
Qué hago mal? o qué me recomiendan?
Default lUpdatePerson := .f.
Default lUpdateClient := .f.
IF ( AppData:oWebDataSource:lConnected )
AppData:oWebDataSource:BeginTrans()
With Object ::oClientesTabla
try
:cSelect := "Select * From persona Where nombre = '" + AllTrim(::oDataSet:Nombre) + "'"
IF ( :Open() )
IF ( :RecCount() > 0 )
:FastEdit()
Else
:FastAddNew()
End
IF ( lUpdatePerson )
:nombre := ::oDataSet:Nombre
:status := IF(::oDataSet:Status == "A", 1, 0)
End
:FastUpdate()
id_persona := :id_persona
:Close()
End
catch e
:Close()
lError := .t.
End
IF ( lError )
Return ( Nil ) //--------Ojo
End
try
:cSelect := "Select * From cliente Where codigo = '" + cClave + "'"
IF ( :Open() )
IF ( :RecCount() > 0 )
:FastEdit()
Else
:FastAddNew()
End
IF ( lUpdateClient )
:codigo := cClave
:id_persona := id_persona
IF ( !Empty(::oDataSet:eMail1) )
:eMail := AllTrim(::oDataSet:eMail1)
End
:rfc := ::oDataSet:RFC
:direccion := AllTrim(::oDataSet:Direccion) + "," + ;
AllTrim(::oDataSet:NoExterior) + "," + ;
AllTrim(::oDataSet:Referencia)
:status := IF(::oDataSet:Status == "A", 1, 0)
End
:FastUpdate()
:Close()
End
catch e
:Close()
End
End With
AppData:oWebDataSource:CommitTrans()
Saludos.
Qué hago mal? o qué me recomiendan?
Default lUpdatePerson := .f.
Default lUpdateClient := .f.
IF ( AppData:oWebDataSource:lConnected )
AppData:oWebDataSource:BeginTrans()
With Object ::oClientesTabla
try
:cSelect := "Select * From persona Where nombre = '" + AllTrim(::oDataSet:Nombre) + "'"
IF ( :Open() )
IF ( :RecCount() > 0 )
:FastEdit()
Else
:FastAddNew()
End
IF ( lUpdatePerson )
:nombre := ::oDataSet:Nombre
:status := IF(::oDataSet:Status == "A", 1, 0)
End
:FastUpdate()
id_persona := :id_persona
:Close()
End
catch e
:Close()
lError := .t.
End
IF ( lError )
Return ( Nil ) //--------Ojo
End
try
:cSelect := "Select * From cliente Where codigo = '" + cClave + "'"
IF ( :Open() )
IF ( :RecCount() > 0 )
:FastEdit()
Else
:FastAddNew()
End
IF ( lUpdateClient )
:codigo := cClave
:id_persona := id_persona
IF ( !Empty(::oDataSet:eMail1) )
:eMail := AllTrim(::oDataSet:eMail1)
End
:rfc := ::oDataSet:RFC
:direccion := AllTrim(::oDataSet:Direccion) + "," + ;
AllTrim(::oDataSet:NoExterior) + "," + ;
AllTrim(::oDataSet:Referencia)
:status := IF(::oDataSet:Status == "A", 1, 0)
End
:FastUpdate()
:Close()
End
catch e
:Close()
End
End With
AppData:oWebDataSource:CommitTrans()
Saludos.
- ignacio
- Site Admin
- Mensajes: 9246
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Error TWebDataSource
Buenos días,
Habría que saber donde se produce el error. No obstante, le recomiendo que parta la transacción. Es muy muy probable que el propio gestor de bases de datos no admita cadenas tan largas.
Saludos
Habría que saber donde se produce el error. No obstante, le recomiendo que parta la transacción. Es muy muy probable que el propio gestor de bases de datos no admita cadenas tan largas.
Saludos
Re: Error TWebDataSource
Estimado Ramón
Tuve el mismo problema pero con TMariaDBDataSource ... y tal cual te recomendó Ignacio a vos, partí la carga de unos 60.000 registros en varios 'push' de 1800 registros por vez
Se acabo el problema.
Un nota: el límite estaba ( como también indica Ignacio ) en el tamaño del 'texto' que genera la sentencia SQL y no en la cantidad de registro que se 'metían' adentro.
Otra opción que manejé fue generar un TXT y cargarlo en el motor ( mysql o Mariadb ) usando LOAD DATA LOCAL INFILE...
Para hacerlo tenía que tener el archivo txt o csv en el servidor y a su vez debia subirlo previamente por FTP...
Quizá en el futuro lo pruebe para archivos muy grandes.
Un saludo,
Claudio
Tuve el mismo problema pero con TMariaDBDataSource ... y tal cual te recomendó Ignacio a vos, partí la carga de unos 60.000 registros en varios 'push' de 1800 registros por vez
Se acabo el problema.
Un nota: el límite estaba ( como también indica Ignacio ) en el tamaño del 'texto' que genera la sentencia SQL y no en la cantidad de registro que se 'metían' adentro.
Otra opción que manejé fue generar un TXT y cargarlo en el motor ( mysql o Mariadb ) usando LOAD DATA LOCAL INFILE...
Para hacerlo tenía que tener el archivo txt o csv en el servidor y a su vez debia subirlo previamente por FTP...
Quizá en el futuro lo pruebe para archivos muy grandes.
Un saludo,
Claudio
Re: Error TWebDataSource
Gracias por responder, empecé a hacer bloques de datos y empezó a correr sin error, son mis primeros pasos con TWebDataSource y los motores SQL, estoy conectado a una Servidor Web con MySQL (xampp).
Donde podría hallar documentación de como hacer el proceso del archivo de texto?
Saludos.
Donde podría hallar documentación de como hacer el proceso del archivo de texto?
Saludos.
Re: Error TWebDataSource
Hola Ramon
Debajo un ejemplo sencillo de como levantar desde un csv dados a mysql con el datasource de maria DB.
El csv tiene dos campos por cada linea. Se llama 'depositos.csv' y esta en la carpeta 'tr'
Los campos los separe con | y las lineas con solo un fin de linea, o sea:
0001|DEPOSITO 001
0002|DEPOSITO 002
Debajo te paso el códifgo que usé...y funcionó.
Espero te sirva (aunque sea para empezar). Un saludo. Claudio
Va el código:
local oDS,aResp,cCmd
WITH OBJECT oDS:=TMariaDBDataSource():New()
:lAbortOnErrors:=.t. // Si hay errores que Aborte !
:lDisplayErrors:=.f. // Que NO muestre errores
:cDatabase:= AllTrim('ejemplos')
:cHost := AllTrim('localhost')
:cPassword:= AllTrim('TEST')
:cUser := AllTrim('TEST')
:lConnected := .T.
:Create()
if :lConnected
cCmd := "LOAD DATA LOCAL INFILE '/tr/depositos.csv' INTO TABLE depositos "
cCmd += "FIELDS TERMINATED BY '|' "
cCmd += "LINES TERMINATED BY '\n' "
cCmd += "(ID_DEPOSITO, DE_DEPOSITO); "
aResp:= :QueryArray(cCmd)
endif
END WITH
Debajo un ejemplo sencillo de como levantar desde un csv dados a mysql con el datasource de maria DB.
El csv tiene dos campos por cada linea. Se llama 'depositos.csv' y esta en la carpeta 'tr'
Los campos los separe con | y las lineas con solo un fin de linea, o sea:
0001|DEPOSITO 001
0002|DEPOSITO 002
Debajo te paso el códifgo que usé...y funcionó.
Espero te sirva (aunque sea para empezar). Un saludo. Claudio
Va el código:
local oDS,aResp,cCmd
WITH OBJECT oDS:=TMariaDBDataSource():New()
:lAbortOnErrors:=.t. // Si hay errores que Aborte !
:lDisplayErrors:=.f. // Que NO muestre errores
:cDatabase:= AllTrim('ejemplos')
:cHost := AllTrim('localhost')
:cPassword:= AllTrim('TEST')
:cUser := AllTrim('TEST')
:lConnected := .T.
:Create()
if :lConnected
cCmd := "LOAD DATA LOCAL INFILE '/tr/depositos.csv' INTO TABLE depositos "
cCmd += "FIELDS TERMINATED BY '|' "
cCmd += "LINES TERMINATED BY '\n' "
cCmd += "(ID_DEPOSITO, DE_DEPOSITO); "
aResp:= :QueryArray(cCmd)
endif
END WITH
Re: Error TWebDataSource
Qué hago mal aquí?
With Object ::oProdPreciosTabla
try
:cSelect := "Select * From precios where id_precio = 0"
:Open()
:FastAddNew()
:nombre := "Precio1"
:Precio := ::oDataSet:Precio1
:FastUpdate()
? id_precio := :id_precio
:Close()
catch
:Close()
End
End With
El campo :id_precio es autoincremental, pero al pasar su valor a la variable id_precio me devuelve cero, y en el inspector de objetos es cero.
Tengo que hacer algo más? o estoy haciendo mal el procedimiento?
Gracias de antemano.
Saludos.
With Object ::oProdPreciosTabla
try
:cSelect := "Select * From precios where id_precio = 0"
:Open()
:FastAddNew()
:nombre := "Precio1"
:Precio := ::oDataSet:Precio1
:FastUpdate()
? id_precio := :id_precio
:Close()
catch
:Close()
End
End With
El campo :id_precio es autoincremental, pero al pasar su valor a la variable id_precio me devuelve cero, y en el inspector de objetos es cero.
Tengo que hacer algo más? o estoy haciendo mal el procedimiento?
Gracias de antemano.
Saludos.
- ignacio
- Site Admin
- Mensajes: 9246
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Error TWebDataSource
Buenos días,
El método TWebRecords:SetLastInsert() es el responsable de hacer dicho trabajo. Básicamente, después del INSERT actualiza UNICAMENTE el primer campo autoincremental siempre que pertenezca a la clave primaria. Es decir, la actualización automática en el dataset de los campos autoincrementales sólo funciona en estas circunstancias:
1) Es campo autoincremental
2) El campo pertence a la clave primaria
3) La clave primaria se compone únicamente con dicho campo
Esto es así, porque la propia función de MySql SQL_LAST_INSERT_ID() devuelve únicamente esta misma información.
Por lo tanto, sino se cumplen las tres condiciones que le digo deberá necesariamente realizar un oDataset:Refresh() completo.
Le recomiendo que ponga unas trazas en el método SetLastInsert() para intentar entender donde puede estar el problema. Por ejemplo:
No obstante, y como puede ver en el código que le muestro, el método TDataSource:nInsertId le devuelve el número que posiblemente esté buscando.
Un saludo
Nota: Yo personalmente desaconsejo absolutamente el uso de campos auto-incrementales. Son totalmente incompatibles con cualquier sistema de sincronización a no ser de que se tenga extremo cuidado en la configuración de su 'semilla'.
El método TWebRecords:SetLastInsert() es el responsable de hacer dicho trabajo. Básicamente, después del INSERT actualiza UNICAMENTE el primer campo autoincremental siempre que pertenezca a la clave primaria. Es decir, la actualización automática en el dataset de los campos autoincrementales sólo funciona en estas circunstancias:
1) Es campo autoincremental
2) El campo pertence a la clave primaria
3) La clave primaria se compone únicamente con dicho campo
Esto es así, porque la propia función de MySql SQL_LAST_INSERT_ID() devuelve únicamente esta misma información.
Por lo tanto, sino se cumplen las tres condiciones que le digo deberá necesariamente realizar un oDataset:Refresh() completo.
Le recomiendo que ponga unas trazas en el método SetLastInsert() para intentar entender donde puede estar el problema. Por ejemplo:
Código: Seleccionar todo
METHOD SetLastInsert() CLASS XWebRecords
LOCAL cField
LOCAL nField
FOR EACH cField IN ::aPKFields
Logdebug( "Primary key: " + cField )
nField := Ascan( ::aStruct, {|v| v[ 'xa_orgname' ] == cField } )
IF nField > 0
Logdebug( "Field found: " + cField )
IF ::aStruct[ nField ][ 'xa_autoinc' ]
Logdebug( "Field NOT autoincremental: " + cField )
ELSE
Logdebug( "Field autoincremental: " + cField )
ENDIF
IF nField > 0 .AND. ::aStruct[ nField ][ 'xa_autoinc' ]
::FieldPut( nField, ::oDataSource:nInsertId )
EXIT
ENDIF
NEXT
RETURN NIL
Un saludo
Nota: Yo personalmente desaconsejo absolutamente el uso de campos auto-incrementales. Son totalmente incompatibles con cualquier sistema de sincronización a no ser de que se tenga extremo cuidado en la configuración de su 'semilla'.
Re: Error TWebDataSource
Gracias OZ, encontré cual era mi problema en lo particular; había puesto un BeginTrans, y el Commit estaba mas adelante del grabado de los datos que requería, eliminé dichos métodos y funcionó correctamente.
Saludos.
Saludos.
Re: Error TWebDataSource
Tengo un detalle nuevo.
Si hago el enlace del TWebDataSource por medio de una URL jala excelente, pero si le pongo la IP marca error de conexión.
Cómo debo indicar la conexión para la IP?
ejemplo:
WITH OBJECT AppData:oWebDataSource := TWebDataSource():New( Self )
:cConnect := "www.zeasoftware.com.mx"
:cDatabase := "zeasoftw_personal"
:cPhpModule := "inventarioz/Web.php"
:cCryptKey := "*****"
:Create()
End
OK
WITH OBJECT AppData:oWebDataSource := TWebDataSource():New( Self )
:cConnect := "192.168.22.100"
:cDatabase := "zeasoftw_personal"
:cPhpModule := "inventarioz/Web.php"
:cCryptKey := "*****"
:Create()
End
Marca error
Saludos.
Si hago el enlace del TWebDataSource por medio de una URL jala excelente, pero si le pongo la IP marca error de conexión.
Cómo debo indicar la conexión para la IP?
ejemplo:
WITH OBJECT AppData:oWebDataSource := TWebDataSource():New( Self )
:cConnect := "www.zeasoftware.com.mx"
:cDatabase := "zeasoftw_personal"
:cPhpModule := "inventarioz/Web.php"
:cCryptKey := "*****"
:Create()
End
OK
WITH OBJECT AppData:oWebDataSource := TWebDataSource():New( Self )
:cConnect := "192.168.22.100"
:cDatabase := "zeasoftw_personal"
:cPhpModule := "inventarioz/Web.php"
:cCryptKey := "*****"
:Create()
End
Marca error
Saludos.
- ignacio
- Site Admin
- Mensajes: 9246
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Re: Error TWebDataSource
Completamente normal, dependiendo de como se esté gestionando su servidor web. Consulte con su proveedor de páginas Web para más información.
Un saludo
Un saludo