Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Duda con fechas (https://www.clubdelphi.com/foros/showthread.php?t=70290)

Paulao 12-10-2010 19:47:17

Duda con fechas
 
En mi proyecto, puzo un campo fecha que viene de un cxDateEdit de DevExpress. En el servidor de aplicaciones, tengo una función que haz gravar en el Banco de Datos, asi:
Código Delphi [-]
'Insert Into Mi_Tabla(Campo_date) values (' + DateToStr(variable_date);
Esto me lo tre un valor NULL y no es NULL, pues si yo hago asi:
Código Delphi [-]
ShowMessage(DateToStr(variable_date));
Funciona. Con certeza estas en la linea "DateToStr()", pues yo tengo un campo DateTime en el banco. Vea mi codigo completo desta funcion en el servidor:
Código Delphi [-]
function InsereOrdemProducao(Conn: TZConnection;s_ordem,s_lote,s_produto,s_valid_lote:string;dt_fab: TDateTime;qde_prod: Double;resp_tec:Integer): OleVariant;
var
  Sql:string;
  cdsGeral: TZQuery;
begin
  Result := False;
  cdsGeral := NovoDataSet(Conn);
  sql := 'INSERT INTO ORDEM_PRODUCAO(NRO_ORDEM,NRO_LOTE,PRODUTO,LOTE_VALIDADE,DT_FABRICA,QDE_PRODUZIR,RESP_TECNICO)VALUES(  ' +
         s_ordem + ',' + s_lote + ',' + s_produto + ',' + s_valid_lote + ',' + DateToStr(dt_fab) + ',' +
         FloatToStr(qde_prod) + ',' + IntToStr(resp_tec) + ')';
  try
    cdsGeral.SQL.Text := Sql;
    cdsGeral.ExecSQL;
    Result := True;
    cdsGeral.ApplyUpdates;
  except
    Result := False;
  end;
  cdsGeral.Close;
  FreeAndNil(cdsGeral);

end;
Y abajo es la llamada a la función, por el client:
Código Delphi [-]
procedure TfrmOrdemProducao.cxButton1Click(Sender: TObject);
begin
  if InsereOrdemProducao(quotedstr(edtNroProd.Text),quotedstr(edtNroLote.Text),quotedstr(edtDescricao.Tex  t),
                         quotedstr(edtValidLote.Text),edtDtFabric.Date,edtQde.Value,1) then
    ShowMessage('Orçamento realizado com sucesso!')
  else
    ShowMessage('Erro ao tentar gravar orçamento');
end;

Uso Delphi 7, MySql 5, Zeos y MultiTier.

Paulao 12-10-2010 19:53:34

Me olvide de otra llamada de Client para servidor es hecha asi:
Código Delphi [-]
function InsereOrdemProducao(s_ordem,s_lote,s_produto,s_valid_lote:string;dt_fab: TDateTime;qde_prod: Double;resp_tec:Integer): Boolean;
begin
  if not ConGeral.Connected then
    ConGeral.Open;
  Result := ConGeral.AppServer.ExecFuncao(INSERE_ORDEM_PRODUCAO,ArrayToStr([s_ordem,s_lote,s_produto,s_valid_lote,DateToStr(dt_fab),FloatToStr(qde_prod),IntToStr(resp_tec)]));
end;

Y en el Servidor tengo esta funcion que hace todo:
Código Delphi [-]
function LeFuncao(Conn: TZConnection; IDFuncao: Integer; Parametros: OleVariant): OleVariant;
begin
  case IDFuncao of
  INSERE_ORDEM_PRODUCAO: Result := InsereOrdemProducao(Conn,PegaItemLista(01,Parametros),
                                                       PegaItemLista(02,Parametros),
                                                       PegaItemLista(03,Parametros),
                                                       PegaItemLista(04,Parametros),
                                                       StrToDate(PegaItemLista(05,Parametros)),
                                                       StrToFloat(PegaItemLista(06,Parametros)),
                                                       StrToInt(PegaItemLista(07,Parametros)));

  else
    Result := '';
  end;
end;

Paulao 12-10-2010 20:00:26

Señores, una corecion. La fecha no estas NULL, pero asi:
12/10/2010 y creo que el MySql no acepta asi, pero como cambiar por el delphi?

ContraVeneno 12-10-2010 20:06:12

En lugar de DateToStr, debes utilizar FormatDateTime para darle el formato que sí acepte MySQL, tambien debes de tomar en cuenta que podrían necesitarse comillas o símbolos para encerrar la fecha de acuerdo a MySQL...

En SQL Server se requieren comillas para encerras fechas:
Código Delphi [-]
SQL := 'Set @Date = ' + QuotedStr(FormatDateTime('yyyy-mm-dd hh:mm:ss', Now));
esto resulta en:
Código:

Set @Date = '2010-10-12 12:47:59'
No recuerdo en MySQL pero creo que debería ser #2010-10-12#


Para mi la mejor opción sería Utilizar parámetros, con eso no necesitas de formatos y conversiones, ya que delphi lo hace solo:
Código Delphi [-]
 with Query do begin
  ...
  SQL.Clear;
  SQL.Add('Set @Date = :ADateValue');
  ParamByName('ADateValue').AsDateTime := Now;
  ...
 end;

Paulao 12-10-2010 20:23:02

Ok, pero si voy con el SQL generado por el programa y ejecutar directo en el Banco de Datos(EMS Lite for MySql), yo consigo grabar, pero por el programa(Delphi) me lo da error.

felipe88 12-10-2010 22:34:42

Siguiendo la idea de ContraVeneno (lo más adecuado), es importante revisar la declaración de tipo de dato.

No manejo mucho MySQL, pero hagamos como ejemplo:
En la base de tados esta declarado como Date y en Delphi lo enviamos como DateTime, esto podría dar conflicto.
En otro ejemplo he visto el orden de paso de los valores, digamos, en la bd dd/mm/aaaa y en Delphi mm/dd/aaaa

Son ideas....


Saludos!

Paulao 12-10-2010 22:36:30

Hizo, las coreciones, la fecha hizo un FormatDate('yyyy-MM-dd',var_date), pero no graba. Yo pego el SQL que es generado en mi aplicacion y si voy directo al MySql(EMS Lite for Mysql) funciona, pero por mi aplicacion no funciona. Que mas puede ser? No es el SQL, pues el si funciona directo en el banco.

felipe88 12-10-2010 22:52:26

Cita:

Empezado por Paulao (Mensaje 379077)
Hizo, las coreciones, la fecha hizo un FormatDate('yyyy-MM-dd',var_date), pero no graba. Yo pego el SQL que es generado en mi aplicacion y si voy directo al MySql(EMS Lite for Mysql) funciona, pero por mi aplicacion no funciona. Que mas puede ser? No es el SQL, pues el si funciona directo en el banco.

Aconsejaría usar un punto de quiebre (F5) para comprobar realmente como se pasa la variable sql al Query. Muchas veces se omiten o se van cosas que no son. Depronto puedas ver la solución


Saludos!

Paulao 12-10-2010 23:10:14

Resolvi, pues mi servidor apuntava para otra unit, pues como hizo una copia del fuente, creo que si quedo aun con los path antiguos, pero estas listo.. Hizo las coreciones, pero ahora al grabar está mui despacio y si queda mui demorado y el erro es de TimeOut. No se lo puede ser ahora. Zeos o otra cosa, o mismo virus, no lo se, pero no graba por el timeout.


La franja horaria es GMT +2. Ahora son las 01:31:26.

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