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.

Error TWebDataSource

Foro de Xailer profesional en español
Responder
Avatar de Usuario
ramonzea
Mensajes: 130
Registrado: Mar Sep 15, 2015 6:42 am
Ubicación: México
Contactar:

Error TWebDataSource

Mensaje por ramonzea »

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.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Error TWebDataSource

Mensaje por ignacio »

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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Claudio C
Mensajes: 60
Registrado: Dom Sep 20, 2015 8:13 pm
Ubicación: Buenos Aires

Re: Error TWebDataSource

Mensaje por Claudio C »

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
Avatar de Usuario
ramonzea
Mensajes: 130
Registrado: Mar Sep 15, 2015 6:42 am
Ubicación: México
Contactar:

Re: Error TWebDataSource

Mensaje por ramonzea »

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.
Claudio C
Mensajes: 60
Registrado: Dom Sep 20, 2015 8:13 pm
Ubicación: Buenos Aires

Re: Error TWebDataSource

Mensaje por Claudio C »

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
Avatar de Usuario
ramonzea
Mensajes: 130
Registrado: Mar Sep 15, 2015 6:42 am
Ubicación: México
Contactar:

Re: Error TWebDataSource

Mensaje por ramonzea »

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.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Error TWebDataSource

Mensaje por ignacio »

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:

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
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'.
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ramonzea
Mensajes: 130
Registrado: Mar Sep 15, 2015 6:42 am
Ubicación: México
Contactar:

Re: Error TWebDataSource

Mensaje por ramonzea »

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.
Avatar de Usuario
ramonzea
Mensajes: 130
Registrado: Mar Sep 15, 2015 6:42 am
Ubicación: México
Contactar:

Re: Error TWebDataSource

Mensaje por ramonzea »

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.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: Error TWebDataSource

Mensaje por ignacio »

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
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder