Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Extraño comportamiento de delphi 7 (https://www.clubdelphi.com/foros/showthread.php?t=54359)

smessina 15-03-2008 20:55:54

Extraño comportamiento de delphi 7
 
Como estan? el tema es el siguiente:
trabajo con Delphi 7 - Mysql 5.0 mediane Zeos - Campos Calculados

debo exportar a Excel el detalle del libro iva Ventas, la Exportacion la Hago de la siguiente manera :
Código Delphi [-]
procedure Tflibrosiva.btnexportarventasClick(Sender: TObject);
var excel,libro:variant; sino:string;
x,y:integer;
fila:integer;
saldo:currency;
fecha1,fecha2:string;
begin   //stock actual
     Excel := CreateOleObject('Excel.Application');

    //Añade un Libro
    Excel.WorkBooks.add;

    //Pone Visible La Ventana
    Excel.visible:=True;
    Libro := Excel.WorkBooks[1].WorkSheets['Hoja1'];
    //Pongo Titulos
    excel.range['a1:g1'].Merge;
    excel.range['a1']:='  IVA VENTAS del período '+ inttostr(calventas.Month)+'/'+inttostr(calventas.Year)    +' al  '+ datetostr(date)+' a hs. '+ timetostr(time);
    Excel.Range['A1'].Font.Name := 'Verdana';
    Excel.Range['A1'].Font.FontStyle := 'Bold';
    excel.range['a1'].font.Color := clgreen;




    Excel.Range['a3:m3'].Font.Name := 'Verdana';
    Excel.Range['a3:m3'].Font.FontStyle := 'Bold';
    excel.range['a3:m3'].font.Color := clgreen;
    excel.Range['A3','m3'].Value:=VarArrayOf(['Fecha','Tipo', 'Número','Razón Social','CUIT', 'Imp. Neto Grab.', '% IVA','Imp. IVA Fact.', 'Imp. Resp.No Insc.', 'Concep. No Grab.','Exentas','Pagos a Cta', 'Total Facturado']);
    fila:=4;  
  // excel.range['g:h'].NumberFormat := '$#.##0,00';
     qventas.First; 
     while qventas.eof=false   do  
   begin        excel.Range['A'+inttostr(fila+3),'m'+inttostr(fila+3)].Value:=VarArrayOf([qventas.FieldByName('fecha').value,qventas.FieldByName('tipolibroiva').value, qventas.FieldByName('Numero').value, qventas.FieldByName('apynombre').value,qventas.FieldByName('CUIT').value, qventas.FieldByName('Calc_netograbado').value,qventas.FieldByName('pocimpuesto').value,qventas.Field  ByName('calc_ivafact').value, qventas.FieldByName('noinscripto').value, qventas.FieldByName('ConcepNoGrab').value,qventas.FieldByName('exenta').value, qventas.FieldByName('pagoacuenta').value, qventas.FieldByName('calc_total').value ]);


     fila:=fila+1;
     qventas.Next;
    end;
  qventas.EnableControls;
  excel.Range['a3'].Select;
  excel.Selection.AutoFilter;
  excel.range['a:z'].Columns.AutoFit;

el error lo tengo en los valores que asume la variable fila, los cuales son absurdos ya que toma primero un valor de 256 todas las veces que se ejecuta dentro del while aunque a veces toma un numero 32 mil y algo, al query lo tengo asociado a dbgrid de los componentes suipack
y en el evento de qventas oncalcfields que es un query de zeos :

Código Delphi [-]
procedure Tflibrosiva.qventasCalcFields(DataSet: TDataSet);
var cadena:string;
begin cadena:=StringOfChar('0', 4-Length(qventas.fieldbyname('puntoventa').asstring))+qventas.fieldbyname('puntoventa').asstring;
cadena:=cadena +'-'+ stringofchar('0',8-Length(qventas.fieldbyname('NumComprobante').asstring))+qventas.fieldbyname('NumComprobante').asstri  ng;
qventas.FieldByName('noinscripto').value:=0;
qventas.FieldByName('numero').value:=cadena;
if (qventas.Fieldbyname('idcomprobante').value=9) or (qventas.FieldByName('idcomprobante').value=11) then begin   qventas.FieldByName('calc_netograbado').Value:= qventas.fieldbyname('trenglon').Value*-1;
  qventas.FieldByName('calc_ivafact').Value:=qventas.fieldbyname('trengloiva').Value*-1;
  qventas.FieldByName('calc_total').value:= (qventas.fieldbyname('trenglon').Value*-1)+(qventas.fieldbyname('trengloiva').Value*-1);
  end else begin       qventas.FieldByName('calc_netograbado').Value:= qventas.fieldbyname('trenglon').Value;
      qventas.FieldByName('calc_ivafact').Value:=qventas.fieldbyname('trengloiva').Value;
      qventas.FieldByName('calc_total').value:= (qventas.fieldbyname('trenglon').Value)+(qventas.fieldbyname('trengloiva').Value);
      end;

end;
yo culpo a los campos calculados puede que no sea ahi el problema pero delphi se comporta de una manera extraña, ya rebice varias veces el codigo y no encuentro ningun error.

alguna idea?

gracias de Antemano.

smessina 15-03-2008 21:03:15

si no se entiende bien vuelvo a subirlo pero cuando haces una vista previa al subir el post en el foro se descompagina todo.

cualquier cosa me avisan

Lepe 15-03-2008 23:47:42

El evento OncalcFields se produce frecuentemente, cuando un campo cambia su valor. Si dentro de OncalcFields modificas el valor de otros campos, hará que se vuelva a ejecutar otra vez más. Creo que por ahí tiene el problema, aunque si llega a la fila 32.000, significará que el query tiene 31.996 registros.

No tendrás ese query en relación Maestro-detalle con otro query o tabla ¿no?

Saludos

smessina 16-03-2008 00:37:58

gracias por responder
 
Gracias por contestar:
no es que llegue a la fila 32.000 es mas el query tiene a lo sumo 30 registros
la variable fila se debe ir incrementando de uno en uno empezando de 4 para ir escribiendo una linea debajo de la otra en el libro de exxcel, eso no sucede porque la variable fila asume valores no previstos y por lo tanto no empieza a escribir el la fila 4 del excel sino que me registra en la fila 260 del libro de excel todos los registros uno sobre otro, esto lo se porque puse un showmessage('Valor de linea :' + inttostr(linea)); para monitorear que valores asume.

no se si el problema viene de los campos calculados, o si se trata de un bugs de delphi que se solucione con algun parche o algo parecido, o yo estare haciendo alguna tontera.

y el query esta aislado no tiene relacion con otro query o tabla.

lo que si tengo mas de un campo calculado que cambios sus valores en el oncalcfield.

Lepe 16-03-2008 13:14:54

No es fallo de delphi, ya encontré donde está el error:
Código Delphi [-]
excel.Range['A'+inttostr(fila+3),'m'+inttostr(fila+3)]

cuando eso se ejecuta, la cosa queda así en tiempo de ejecución:
Código Delphi [-]
excel.Range[A7,m7]
pero eso no está entre comillas !! quizás esté calculando el código ascii de la letra "A" y lo multiplique por siete, y lo mismo con la "m", después de todo, a saber el valor que interpreta realmente.

Tú esperas que quedara así:
Código Delphi [-]
excel.Range['A7','m7']
y para conseguirlo, el código debe ser (bueno un ejemplo de cómo lo haría yo)
Código Delphi [-]
function GetCelda(letra:char; fila:integer):string;
begin
   Result := QuotedStr(letra + inttostr(fila));
end;

excel.Range[GetCelda('A',fila + 3),
            GetCelda('m', fila + 3) ]

El truco: QuotedStr.

Saludos

smessina 18-03-2008 12:50:54

Gracias por Contestar y perdon por la demora,
estuve viendo lo que me dijiste y no esta por ahi el error, ya que
esto mismo lo tengo funcionando en otras exportaciones a excell y me funciona bien, y cuando le paso el rango con las "" (quotas) me da un error de oleXXXXXX no me acuerdo cuanto.

Voy a tratar reinstalando Delphi, porque a demas me estan saliendo otros errores un poco raros y ya ando medio perdido con todo esto.

Muchas gracias por tu atencion Lepe y despues te cuento como fue y si no se soluciona reinstalando vamos a seguir buscando.

Gracias y un Abrazo


La franja horaria es GMT +2. Ahora son las 05:53:35.

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