Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Actualizaciones de Campos en un ADOQuery!! (https://www.clubdelphi.com/foros/showthread.php?t=23184)

Chocoslovaco 08-07-2005 20:22:26

Actualizaciones de Campos en un ADOQuery!!
 
Buenas Tardes (desde México) a To2:
Soy totalmente nuevo en desarrollo de Delphi, pero creo que ya le tome el suficiente cariño. Estoy haciendo un aplicacion para actualizaciones en un BD de Access (97) y Delphi 7. Quisiera saber si:¿Mi codigo es Correcto?, (al compilarlo no marca ningun error), o si las operaciones que intento hacer a nivel de registros ¿Son Correctas?, Todo mi codigo avanza aparentemente bien, pero no observo ningun cambio en la BD :( , Anexo parte de mi codigo, ojala y alguien puede auxiliarme. Gracias
QKardex,QActualiza, QInsertados: son objetos TADOQuery en mi Form.
Código Delphi [-]
  
.
.
with QKardex do 
begin   //Inicia With QKardex
   Close; SQL.Clear;
   SQL.Text:='SELECT IdCrédito,Pagada,PagadaE..'
   Open;
   if Not(Eof) then //SI CONSULTA KARDEX NO ES VACIA
     begin
     Edit;
     FieldValues['ImporteE']:=FieldValues['ImporteE']+ QActualiza.FieldValues['Aplicar'];
     if FieldValues['ImporteE']>=FieldValues['Totales'] then
       begin // SI ImporteE>=Totales
       if FieldValues['ImporteE']>FieldValues['Totales'] then
         begin
         AbonoP:=FieldValues['ImporteE'] - FieldValues['Totales'];
         QInsertados.Close;
         QInsertados.SQL.Clear;
         QInsertados.SQL.Text:='INSERT INTO [Abonos Pendientes] (Cliente,Importe,IdAbono) VALUES('+ Quotedstr(Cliente) + ',' + IntToStr(prNoFactura) +')';
         QInsertados.ExecSQL;
          FieldValues['ImporteE']:= FieldValues['Totales'];
          QInsertados.Close;
          end;// Fin ImporteE>Totales
          FieldValues['Pagada']:=-1; FieldValues['PagadaE']:=-1;
          FieldValues['Parcial']:=0; FieldValues['ParcialE']:=0;
          FieldValues['Importe']:=FieldValues['ImporteE'];
          Update;
          QInsertados.SQL.Clear;
          QInsertados.SQL.Text:='UPDATE Pedidos SET Pagada=-1,PagadaE=-1,ParcialE=0,ImporteE='+ FieldValues['Importe'] + ' WHERE IdPedido=' + FieldValues['IdCrédito'];
          QInsertados.ExecSQL;
          QInsertados.Close;
          end
        else //Else SI ImporteE>=Totales
          begin ....
              .....

SALUDOS. Oswaldo Jr

ContraVeneno 09-07-2005 00:31:50

creo que tienes 3 campos en la instrucción intert y dos campos en Values, a menos que cliente tenga los dos valores, pero no creo que sea correcto :confused:

Chocoslovaco 09-07-2005 01:28:21

Gracias por la observacion, es muy cierto el codigo correcto debe ser:
Código Delphi [-]
QInsertados.SQL.Clear;
 QInsertados.SQL.Text:='INSERT INTO [Abonos Pendientes] (Cliente,Importe,IdAbono) VALUES('+ Quotedstr(Cliente) + ',' + IntToStr(AbonoP) + ',' + IntToStr(prNoFactura) +')';
    QInsertados.ExecSQL;

Quizas no formule bien mi pregunta, lo que quiero saber si mi sintaxis es correcta, es decir; si hacer operaciones con los campos de esta forma:
FieldValues['Pagada']:=-1; FieldValues['PagadaE']:=-1;

ahora cuando llega la ejecucion hasta aqui:
Código Delphi [-]
  
....
QInsertados.SQL.Clear;
QInsertados.SQL.Text:='UPDATE Pedidos SET Pagada=-1,PagadaE=-1,ParcialE=0,ImporteE='+ FieldValues['Importe'] + ' WHERE IdPedido=' + FieldValues['IdCrédito'];
 QInsertados.ExecSQL;
...

Me envia un error de : "Could No Convert Variant of type (String) into type (Currency)"

lucasarts_18 09-07-2005 18:27:53

Cita:

Empezado por Chocoslovaco
Me envia un error de : "Could No Convert Variant of type (String) into type (Currency)"

Hola:

Prueba con ésta función

StrtoCurr

Saludos.

Aarón.

ContraVeneno 09-07-2005 18:29:23

Mientras coloques la instrucción Edit antes de Fieldvalues['x']:=12 es correcto. solo no olvides colocar un update o cancel al final.

Cuando utilizas FieldValues['campo'] te lo va a regresar como tipo variant, pero en este caso como lo estas utilizando para formar una cadena, te lo manda como cadena. Entonces tienes que convertir FieldValues['Importe'] a tipo currency.
Puede ser: Fields[(número de campo)].ascurrency o utilizar la función strtocurr

Chocoslovaco 11-07-2005 19:44:54

No se Actualizan los campos...
 
Aqui de nuevo....Gracias por las respuestas me han sido de muchisima ayuda, ya existe ningun error al compilar...pero ahora me surge otro problema :(
cuando ejecuto el programa al llegar a esta parte...(donde FieldValues['Pagada']:=true; FieldValues['PagadaE']:=true;...) ..
Código Delphi [-]
....
with QKardex do begin
Close; SQL.Clear;
SQL.Text:='SELECT IdCrédito,Pagada,PagadaE,Parcial,Parcia.. FROM Tabla7 '+
                'WHERE ((Pedido="Cargo") OR (Pedido="Nota de Cargo")... '+
                'AND NoFactura=' + IntToStr(prNoFactura) + 'AND NombreCompañía='+ Quotedstr(Cliente);
      Open;
....
FieldValues['Pagada']:=true; FieldValues['PagadaE']:=true;
          FieldValues['Parcial']:=false; FieldValues['ParcialE']:=false;
          FieldValues['Importe']:=CurrToStr(FieldValues['ImporteE']);
          Update;
          QInsertados.SQL.Clear;
          QInsertados.SQL.Text:='UPDATE Pedidos SET Pagada=-1,PagadaE=-1,ParcialE=0,ImporteE='+ CurrToStr(FieldValues['Importe']) + ' WHERE IdPedido=' + IntToStr(FieldValues['IdCrédito']);
          QInsertados.ExecSQL;
          QInsertados.Close;
....

No sucede nada en la tabla afectada, despues de hacer el Update...¿Alguien podria decirme cual es el problema? los campos Pagada, Parcial, ParcialE, PAgadaE son de tipo Si/No, ya intente colocando los valores 0 y -1, pero tampoco se actualizan...Por sus comentarios Gracias

ContraVeneno 11-07-2005 19:53:19

Verifica que QKardex te devuelva registros, parece ser que cuando abres QKardex no obtiene ningún resultado y por eso no realiza ningúna acción. Revisa la sentencia SQL de QKardex y que esta te regrese registros.

Chocoslovaco 11-07-2005 20:10:17

:( Si QKardex si me arroja datos...de hecho antes de que entre a realizar el proceso con los registros tengo esto despues de abrir la consulta...
Código Delphi [-]
.... 
if Not(Eof) then //SI CONSULTA KARDEX NO ES VACIA
     begin
.....
No entiendo cual pueda ser el problema pues hice esto para probar..
Código Delphi [-]
.. .. 
   FieldValues['Parcial']:=true; FieldValues['ParcialE']:=true;
   FieldValues['Importe']:= FieldValues['ImporteE'].AsCurrency;
  end;
  Update;
  ShowMessage(CurrToStr( FieldValues['Importe']));
y me arroja el valos que se asigno dos lineas arriba...¿Existe alguna otra cosa que deba revisar??? o ¿Deberia revisar algo mas??, tengo otros ADOQuery donde uso por ejemplo actualizacion o eliminacion y esos si surten efecto sobre la tabla afectada. Gracias de nuevo

Chocoslovaco 13-07-2005 20:45:34

Debo Cambiar de Componente???
 
Hola de nuevo a todos, aun sigo sin poder resolver el problema de la actualizacion de los campos:( .... he buscado en los foros si ya existe una consulta similar sin tener exito, ahora no se si lo que pasa es que ¿utilize el componente incorrecto?, ¿deberia cambiar el componente?..por un ADODataSet...si es asi alguien me pude explicar como debo usarlo. Gracias

ContraVeneno 14-07-2005 16:46:34

en la parte del showmessage es correcto ¿cierto?

¿pero no se reflejan los cambios? si en el showmessage es correcto, entonces los cambios ya deberían estar hechos. ¿No te hará falta hacer un refresh en donde revisas si se hicieron los cambios?

Chocoslovaco 14-07-2005 19:14:49

Abro directamente la BD
 
Efectivamente los cambios ya deberian estar hechos.
Para revisar he abierto despues de que termina mi aplicacion,
la BD, y consultado directamente las tablas, y solo las tablas
que afecte haciendo un UPDATE o DELETE, son las que registraron
los cambios, en las tablas donde utilize modificaciones a traves del
ADOQuery....Edit.....Update... no pasó absolutamente nada.
coloco de nuevo el codigo (espero no se torne muy tedioso)
y agradezco la atencion prestada y los comentarios que me
puedan hacer al respecto. Saludos
Código Delphi [-]
 
procedure TInicio.RepagadoEspecifico(Cliente:string);
var
  IdCliente,prNoFactura:integer;
  AbonoP:Real;
begin
  with QActualiza do 
   begin
    SQL.Clear; SQL.Text:='DELETE * FROM [Abonos no Aplicados]'; ExecSQL;
    SQL.Clear; SQL.Text:='DELETE * FROM [Abonos Pendientes]';   ExecSQL;
    SQL.Clear; SQL.Text:='SELECT Id AS Registro FROM Clientes WHERE '+
                                   'NombreCompañía=' + Quotedstr(Cliente); Open;
    IdCliente:=FieldValues['Registro']; SQL.Clear;
    SQL.Text:='UPDATE Tabla7 SET '+ 
             'Pagada=0,PagadaE=0,Parcial=0,PArcialE=0,Importe=0,ImporteE=0 '+
              'WHERE ((Pedido="Cargo") OR (Pedido="Nota de Cargo") ' + 
              'OR  (Pedido="CargoF") OR (Pedido="Abono")) '+
              'AND NombreCompañía='+ Quotedstr(Cliente);
    ExecSQL; SQL.Clear;
    If IdCliente <> 0 Then
    begin
      SQL.Text:='UPDATE Pedidos SET Pagada=0,PagadaE=0,ParcialE=0,ImporteE=0 WHERE Idpor=3 And IdCliente='+  IntToStr(IdCliente);
      ExecSQL; SQL.Clear;
      SQL.Text:='SELECT IdMovimiento, Aplicar, Factura FROM [Consulta A&B PagadoEspecifico] '+
                'WHERE NombreCompañía=' + Quotedstr(Cliente) +' ORDER BY Fecha';
      Open;
    end;
  end;
  while Not(QActualiza.Eof) do
    begin  //Inicia While
    prNoFactura:=QActualiza.FieldValues['Factura'];
    with QKardex do
      begin   //Inicia With QKardex
      Close; SQL.Clear;
      SQL.Text:='SELECT IdCrédito,Pagada,PagadaE,Parcial,ParcialE,Importe,ImporteE,Totales FROM Tabla7 '+
                'WHERE ((Pedido="Cargo") OR (Pedido="Nota de Cargo") OR (Pedido="CargoF")) '+
                'AND NoFactura=' + IntToStr(prNoFactura) + 'AND NombreCompañía='+ Quotedstr(Cliente);
      Open;
      if Not(Eof) then //SI CONSULTA KARDEX NO ES VACIA
        begin
        Edit;
        FieldValues['ImporteE']:=FieldValues['ImporteE'] + QActualiza.FieldValues['Aplicar'];
        if FieldValues['ImporteE']>=FieldValues['Totales'] then
          begin // SI ImporteE>=Totales
          if FieldValues['ImporteE']>FieldValues['Totales'] then
            begin
            AbonoP:=FieldValues['ImporteE'].AsReal - FieldValues['Totales'].AsReal;
            QInsertados.Close;
            QInsertados.SQL.Clear;
            QInsertados.SQL.Text:='INSERT INTO [Abonos Pendientes] (Cliente,Importe,IdAbono) VALUES('+ Quotedstr(Cliente) + ',' + CurrToStr(AbonoP)+ ',' + IntToStr(prNoFactura) +')';
            QInsertados.ExecSQL;
            FieldValues['ImporteE']:= FieldValues['Totales'].AsCurrency;
            Update;
            QInsertados.Close;
            end;// Fin ImporteE>Totales
          FieldValues['Pagada']:=True; FieldValues['PagadaE']:=True;
          FieldValues['Parcial']:=False; FieldValues['ParcialE']:=False;
          FieldValues['Importe']:=FieldValues['ImporteE'];
          Update;
          QInsertados.SQL.Clear;
          QInsertados.SQL.Text:='UPDATE Pedidos SET Pagada=-1,PagadaE=-1,ParcialE=0,ImporteE='+ CurrToStr(FieldValues['Importe']) + ' WHERE IdPedido=' + IntToStr(FieldValues['IdCrédito']);
          QInsertados.ExecSQL;
          QInsertados.Close;
          end
        else //Else SI ImporteE>=Totales
          begin
          FieldValues['Pagada']:=False; FieldValues['PagadaE']:=False;
          FieldValues['Parcial']:=True; FieldValues['ParcialE']:=True;
          FieldValues['Importe']:=FieldValues['ImporteE'];
          Update;
          QInsertados.SQL.Clear;
          QInsertados.SQL.Text:='UPDATE Pedidos SET Pagada=-1,PagadaE=-1,ParcialE=0,ImporteE='+ CurrToStr(FieldValues['Importe']) +' WHERE IdPedido=' + IntToStr(FieldValues['IdCrédito']);
          QInsertados.ExecSQL;
          QInsertados.Close;
          end; // Termina SI ImporteE>=Totales
        end
      else // Else SI CONSULTA KARDEX NO ES VACIA
        begin
        Close; SQL.Clear;
        SQL.Text:='SELECT IdCrédito,Pagada,PagadaE,Parcial,ParcialE,Importe,ImporteE,Totales '+
                  'FROM Tabla7 '+
                  'WHERE IdCrédito=1 AND ((Pedido="CargoF") OR (Pedido="Nota de Cargo") OR (Pedido="Cargo")) AND NombreCompañía=' + QuotedStr(Cliente);
                  Open;
        If Eof then
          begin
          QInsertados.SQL.Clear;
          QInsertados.SQL.Text:='INSERT INTO [Abonos Pendientes](Cliente,Importe,IdAbono) VALUES ('+ QuotedStr(Cliente) + ',' + CurrToStr(QActualiza.FieldValues['Aplicar']) + ',' + IntToStr(QActualiza.FieldValues['Factura']) + ')';
          QInsertados.ExecSQL;
          QInsertados.Close;
          end
        else
          begin
          Edit;
          FieldValues['ImporteE']:=FieldValues['ImporteE']+FieldValues['Haber'];
          if FieldValues['ImporteE']>=FieldValues['Totales'] then
            begin
            if FieldValues['ImporteE']>=FieldValues['Totales'] then
              begin
              AbonoP:=FieldValues['ImporteE'].AsReal - FieldValues['Totales'];
              QInsertados.SQL.Clear;
              QInsertados.SQL.Text:='INSERT INTO [Abonos Pendientes] (Cliente, Importe, IdAbono) VALUES ('+ QuotedStr(Cliente) + ','+ CurrToStr(AbonoP) + ','+ IntToStr(prNoFactura) +',';
              QInsertados.ExecSQL;
              QInsertados.Close;
              FieldValues['ImporteE']:= FieldValues['Totales'].AsCurrency;
              end;
            FieldValues['Pagada']:=true; FieldValues['PagadaE']:=true;
            FieldValues['Parcial']:=false; FieldValues['ParcialE']:=false;
            FieldValues['Importe']:= FieldValues['ImporteE'].AsCurrency;
            end
          else
            begin
            FieldValues['Pagada']:=false; FieldValues['PagadaE']:=false;
            FieldValues['Parcial']:=true; FieldValues['ParcialE']:=true;
            FieldValues['Importe']:= FieldValues['ImporteE'].AsCurrency;
            end;
          Update;
          end
        end; //TERMINA SI CONSULTA KARDEX NO ES VACIA
        QActualiza.Next;
      end;  // Termina With QKardex
    end; // Termina While
end;//Repagado Especifico

ContraVeneno 14-07-2005 19:36:15

Cambia la instrucción Update por Post

Chocoslovaco 14-07-2005 20:00:04

Es muy raro???
 
Ya realize el cambio que me sugeriste. y sigue sin surtir efecto.
¿Que estaré hacindo mal?..
La BD la abro de la sig forma:
Código Delphi [-]
  
procedure TInicio.FormCreate(Sender: TObject);
begin
try
  ConexionBD.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Servidor\Back Sistema Empresarial1.3.mdb;Persist Security Info=False';
  ConexionBD.LoginPrompt:=False;
  ConexionBD.Connected:=True;
  MessageDlg('Conexion','Conexión con la Base de Datos establecida con éxito',mtInformation,[mbOK],0,mbOK);
except
  on E:Exception do
    begin
      MessageDlg('Error de Conexion','Error en la Conexión con la Base de Datos',mtWarning,[mbOK],0,mbOK);
      ConexionBD.Close
    end;
end;
end;

la Propiedad en diseño: Mode esta en cmShareDenyNone, o sera un problema
con el componente??? o con el ADO??..pero esto :
Código Delphi [-]
...
with QActualiza do
  begin
    SQL.Clear; SQL.Text:='DELETE * FROM [Abonos no Aplicados]'; ExecSQL;
    SQL.Clear; SQL.Text:='DELETE * FROM [Abonos Pendientes]';   ExecSQL;
    SQL.Clear; SQL.Text:='SELECT Id AS Registro FROM Clientes WHERE NombreCompañía=' + Quotedstr(Cliente);
    Open;
...

Si funciona las tablas son afectadas....

ContraVeneno 14-07-2005 20:06:10

Pues si que esta bastante raro.

me he quedado sin ideas.

Chocoslovaco 14-07-2005 20:26:08

Alguna otra sugerencia...
 
Gracias ContraVeneno por tomarte la molestia de contestar
y agradezco tus comentarios. Gracias.
Alguien más podria escribir algun comentario???? por favor....:(

Chocoslovaco 20-07-2005 21:31:24

Alguna forma diferente de operar los registros???
 
Saludos a todos..
pues se daran cuenta que sigo aun con el mismo problema.
Ya no se que es lo que pasa con mi aplicacion..de cierta forma estoy desesperado.:(
Ahora bien, estuve pensando si es la forma de referirme a los registros,
pero como soy un novato en estos asuntos, ¿Alguien me puede decir si
los puedo modificar de alguna otra forma?, es decir no haciendolo asi:
Código Delphi [-]
...
  FieldValues['Pagada']:=True; FieldValues['PagadaE']:=True;
  FieldValues['Parcial']:=False; FieldValues['ParcialE']:=False;
  FieldValues['Importe']:=FieldValues['ImporteE'];
...

ContraVeneno 20-07-2005 21:34:47

podrías usar Fields[X] x= número de campo.

Chocoslovaco 21-07-2005 19:25:23

Aun tengo esperanzas...
 
Gracias por responder, ya lo intente haciendolo de la forma que dices..
pero no funciona :(
Ahora..de tanto estar cambiando codigo, observe que :
Código Delphi [-]
...
Edit;
FieldValues['ImporteE']:=FieldValues['ImporteE'] + QActualiza.FieldValues['Aplicar'];
....
esto es tratado como strings, ahora alguien puede decirme, si esto me devuelve:
ImporteE=30.5
Aplicar=30
1.- 30.530 (concatenado) ó
2.- 60.50 (suma)
esto ultimo es lo que pretendo...agradezco de nuevo y disculpen la molestia.

ContraVeneno 21-07-2005 19:48:45

para asegurarte e que te lo sume puedes usar Fields[X].asfloat + Fields[X].asfloat

o utilizar strtofloat()

tengo entendido que cuando utilizas fieldValues[] toma el valor tipo variant y luego automáticamente lo convierte al tipo e dato que el compilador supone se va a utilizar. Entonces en toería debería sumarlos como float, pero para estar seguros
despues del post pon un showmessage(fieldvalues['importeE']); para que veas como te lo guardo.

Chocoslovaco 22-07-2005 00:25:55

Magia?, Error de Programacion?? o Capricho de Delphi?
 
Gracias por responder.
Y les tengo una noticia, la aplicacion ya corre y muy bien. ¿Que le hice?
En si Nada, practicamente nada, el codigo quedo tal y como esta en unos de los
mensajes aqui publicados. Despues de estar intentando durante varias semanas,
y seguir los consejos que me brindaron, este dia comenze a correr la aplicacion limitandola a unas condiciones especiales en mi seleccion del cliente y ohhh!!! :D
los registros se actualizaron tal y como pretendia que se hiciera.
No se exactamente cual era el problema, pues como comento no realize modificaciones extras.
Nuevamente, agradezco a todos.:p


La franja horaria es GMT +2. Ahora son las 05:07:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi