PDA

Ver la Versión Completa : App se cierra al ejecutar query


amadis
11-12-2019, 11:40:58
Que tal colegas,

Necesito un par de ojos extra.

Estoy haciendo una app que envía y recibe datos de una base de datos en pc via datasnap. (eso está todo bien)

En la App, debo mantener el listado de clientes actualizado, para ello hay un botón RECIBIR CLIENTES que activa un clientdaset que contiene la info actualizada. Luego lo recorro, y si el cliente NO existe en la DB Sqlite, lo inserto, o si existe lo actualizo.

El problema que tengo es que hay algo en mi Query de actualizar que corta el programa y se sale. Y lo raro es que si compilo y ejecuto la App en win32 funciona bien, pero al compilo en Android se sale al entrar en actualizar.

QryRec := TFDQuery.Create(Principal);
cdscli.DisableControls;
cdscli.First;
Application.ProcessMessages;

while not cdscli.Eof
do
begin
try
begin

QryRec.Close;
QryRec.SQL.Clear;
QryRec.Connection := datos.FDconmovil;
QryRec.UpdateTransaction := datos.FDTrans;
QryRec.Transaction := datos.FDTrans;
QryRec.SQL.Append('INSERT INTO CLIENTES');
QryRec.SQL.Append('(ID, NOMBRES, CUIT, TEL, CEL, EMAIL, IVA, PROVINCIA, LOCALIDAD, ZONA, LISTA, DESCUENTO, VENDEDOR, DOCUMENTO, LIMITE, FECHA)');
QryRec.SQL.Append('values(:id, :nom, :cuit, :tel, :cel, :mail, :iva, :pro, :loc, :zo, :list, :desc, :ven, :doc, :lim, :fe) ');
QryRec.ParamByName('id').AsInteger := cdscliid.Value;
QryRec.ParamByName('fe').AsDateTime := cdscliactualiz.AsDateTime;
QryRec.ParamByName('nom').AsString := cdsclinombres.AsString;
QryRec.ParamByName('cuit').AsString := cdsclicuit.Value;
QryRec.ParamByName('tel').AsString := cdsclitel.AsString;
QryRec.ParamByName('cel').AsString := cdsclicel.AsString;
QryRec.ParamByName('mail').AsString := cdscliemail.AsString;
QryRec.ParamByName('iva').AsString := cdscliiva.Value;
QryRec.ParamByName('pro').AsInteger := cdscliprovincia.Value;
QryRec.ParamByName('loc').AsString := cdsclilocalidad.Value;
QryRec.ParamByName('zo').AsInteger := cdsclizona.Value;
QryRec.ParamByName('list').asinteger := cdsclilista.Value;
QryRec.ParamByName('desc').AsFloat := cdsclidescuento.Value;
QryRec.ParamByName('ven').AsInteger := cdsclivendedor.Value;
QryRec.ParamByName('doc').AsInteger := cdsclidocumento.Value;
QryRec.ParamByName('lim').AsFloat := cdsclilimite.Value;


QryRec.ExecSQL;
nue := nue+1;
Application.ProcessMessages;
end;
except
begin

QryRec.Close;
QryRec.SQL.Clear;
QryRec.Connection := datos.FDconmovil;
QryRec.UpdateTransaction := datos.FDTrans;
QryRec.Transaction := datos.FDTrans;
QryRec.SQL.Append('UPDATE CLIENTES');
QryRec.SQL.Append('SET NOMBRES = :nom, CUIT = :cuit, TEL = :tel, CEL = :cel, EMAIL = :mail, IVA = :iva, PROVINCIA = :pro, LOCALIDAD = :loc, ZONA = :zo, LISTA = :list, DESCUENTO = :desc, VENDEDOR = :ven, DOCUMENTO = :doc, LIMITE = :lim, FECHA = :fe');
QryRec.SQL.Append('where ID = :id and (fecha < :fe)');
QryRec.ParamByName('id').AsInteger := cdscliid.Value;
QryRec.ParamByName('fe').AsDateTime := cdscliactualiz.AsDateTime;
QryRec.ParamByName('nom').AsString := cdsclinombres.AsString;
QryRec.ParamByName('cuit').AsString := cdsclicuit.Value;
QryRec.ParamByName('tel').AsString := cdsclitel.AsString;
QryRec.ParamByName('cel').AsString := cdsclicel.AsString;
QryRec.ParamByName('mail').AsString := cdscliemail.AsString;
QryRec.ParamByName('iva').AsString := cdscliiva.Value;
QryRec.ParamByName('pro').AsInteger := cdscliprovincia.Value;
QryRec.ParamByName('loc').AsString := cdsclilocalidad.Value;
QryRec.ParamByName('zo').AsInteger := cdsclizona.Value;
QryRec.ParamByName('list').asinteger := cdsclilista.Value;
QryRec.ParamByName('desc').AsFloat := cdsclidescuento.Value;
QryRec.ParamByName('ven').AsInteger := cdsclivendedor.Value;
QryRec.ParamByName('doc').AsInteger := cdsclidocumento.Value;
QryRec.ParamByName('lim').AsFloat := cdsclilimite.Value;
QryRec.ExecSQL;
act := act+1;
Application.ProcessMessages;
end;
end;
c := c +1;
LbRec.Text := inttostr(c);

Application.ProcessMessages;
cdscli.Next;
end;
QryRec.free;
pnespere.Visible := false;

end;

Showmessage(inttostr(act) + ' Clientes actualizados y '+ inttostr(nue)+ ' nuevos');
cdscli.Close;



En el trozo de código de arriba se ve la creación del Query, el armado de las 2 consultas y la asignación de parámetros.

Que cosa rara o mal ubicada puede estar causando ese problema?

dec
11-12-2019, 20:06:41
Hola a todos,

¿No podrías poner el código en un bloque "try .. except" a ver si se produce alguna excepción?

amadis
13-12-2019, 15:30:15
Que tal Amigos,

les cuento que logré ejecutar el query pero no se cómo.

Resulta, que como el query que fallaba era el segundo (el UPDATE CLIENTES), pues para testear primero reemplacé en la asignación de valores a parametros, el .value del campo del clientdataset por su valor correspondiente (.asstring, .asfloat, etc). Y seguía fallando
Luego lo corté todo y comencé a ejecutar el query con un solo parametro y un campo a actualizar, y funcionaba, y luego fui agregando de a uno los parametros a los respectivos campos. Iba funcionando, hasta que en el campo LOCALIDAD, falló, revisé que podía haber de raro ahí y no encontré nada, lo salteé, agregué el resto de los campos, y funcionó todo incluso agregué un campo DOMICILIO que originalmente había olvidado y actualizó, y después volví a poner el parametro y campo localidad en su lugar y todo funciona, pero no entiendo que cambió.

Así me quedó ahora el bloque del query funcionando

QryRec.Close;
QryRec.SQL.Clear;
QryRec.Connection := datos.FDconmovil;
QryRec.UpdateTransaction := datos.FDTrans;
QryRec.Transaction := datos.FDTrans;
QryRec.SQL.Append('UPDATE CLIENTES');
// QryRec.SQL.Append('SET NOMBRES = :nom, CUIT = :cuit, TEL = :tel, CEL = :cel, EMAIL = :mail, IVA = :iva, PROVINCIA = :pro, LOCALIDAD = :loc, ZONA = :zo, LISTA = :list, DESCUENTO = :desc, VENDEDOR = :ven, DOCUMENTO = :doc, LIMITE = :lim, FECHA = :fe');
QryRec.SQL.Append('SET NOMBRES = :nom, CUIT = :cuit,TEL = :tel, CEL = :cel, EMAIL = :mail, IVA = :iva, PROVINCIA = :pro, LOCALIDAD = :loc, ZONA = :zo, LISTA = :list, DESCUENTO = :desc, VENDEDOR = :ven, DOCUMENTO = :doc, LIMITE = :lim, DOMICILIO = :dom, FECHA = :fe');
QryRec.SQL.Append('where ID = :id and (fecha < :fe)');
QryRec.ParamByName('id').AsInteger := cdscliid.AsInteger;
QryRec.ParamByName('fe').AsDateTime := cdscliactualiz.AsDateTime;
QryRec.ParamByName('nom').AsString := cdsclinombres.AsString;
QryRec.ParamByName('cuit').AsString := cdsclicuit.AsString;
QryRec.ParamByName('tel').AsString := cdsclitel.AsString;
QryRec.ParamByName('cel').AsString := cdsclicel.AsString;
QryRec.ParamByName('mail').AsString := cdscliemail.AsString;
QryRec.ParamByName('iva').AsString := cdscliiva.AsString;
QryRec.ParamByName('pro').AsInteger := cdscliprovincia.AsInteger;
QryRec.ParamByName('loc').AsString := cdsclilocalidad.AsString;
QryRec.ParamByName('zo').AsInteger := cdsclizona.AsInteger;
QryRec.ParamByName('list').asinteger := cdsclilista.AsInteger;
QryRec.ParamByName('desc').AsFloat := cdsclidescuento.AsFloat;
QryRec.ParamByName('ven').AsInteger := cdsclivendedor.AsInteger;
QryRec.ParamByName('doc').AsInteger := cdsclidocumento.AsInteger;
QryRec.ParamByName('dom').AsString := cdsclidomicilio.AsString;
QryRec.ParamByName('lim').AsFloat := cdsclilimite.AsFloat;
QryRec.ExecSQL;
act := act+1;
Application.ProcessMessages;

Pero no veo ningún cambio significativo que antes hubiese podido causar la falla.

TiammatMX
13-12-2019, 20:28:54
...Iba funcionando, hasta que en el campo LOCALIDAD, falló, ... y no encontré nada, lo salteé, ... funcionó todo incluso agregué un campo DOMICILIO ...

No quiero señalar lo obvio, pero ¿no será que el campo LOCALIDAD es el problema? Digo, así lo vería yo...