Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con Código y Guardar en base de datos (https://www.clubdelphi.com/foros/showthread.php?t=93186)

DiegoPucho 09-06-2018 19:44:00

Problema con Código y Guardar en base de datos
 
Hola a todos de ante mano, para seguir preguntando cosas sencillas pero me trabo y no se como conseguir lo que quiero.
Les cuento que estoy aprendiendo y hace muy poco que estoy con delphi, lo que encuentro sumamente interesante. Lo que espero que me tengan paciencia. También les cuento que es por voluntad propia y no tengo ha nadie que le pueda preguntar, por supuesto los tengo a ustedes.;)

Aquí el problema, Tengo un Form de productos donde guardo en una base de datos (creo que es plana, se guarda en la maquina)... tengo edit y más.

1° Ordenar Código. (esta bien lo que hice?) Código donde intento guardar en base de datos.
Código Delphi [-]
procedure TTFormNuevoProducto.BtnGuardarClick(Sender: TObject);
begin
  With FrmModArt.QProductos do
   begin
    if Locate('Codigo',EditCodigo.Text,[]) then  //Si Codigo se duplica manda mensaje.
  begin
    MessageDlg('Este Código de Producto ya existe.', mtWarning, [mbOK], 0);
    EditCodigo.SetFocus;
    EditCodigo.Color:=clSkyBlue;
  end
  else
    if Trim(EditDescripcion.Text) = '' then     //Si Descripcion esta vacio manda mensaje.
  begin
    ShowMessage('Debe Ingresar la Descripción del Producto.');
    EditDescripcion.SetFocus;
    EditDescripcion.Color:=clSkyBlue;
  end
  else
    if Trim(EditCodigo.Text) = '' then          //Si Codigo esta vacio manda mensaje.
  begin
    ShowMessage('Debe Ingresar un Código del Producto.');
    EditCodigo.SetFocus;
    EditCodigo.Color:=clSkyBlue;
  end
 else
  begin
   FrmModArt.QProductos.Insert;   ///Acá abre base de Datos para Insertar.
   try
   FrmModArt.QProductos.FieldByName('Codigo').Text:= EditCodigo.Text;
   FrmModArt.QProductos.FieldByName('Descripcion').Text:= EditDescripcion.Text;
   ...
   FrmModArt.QProductos.FieldByName('idProveedor').Text:= ComboBoxProveedor.KeyValue; ///   acá el 2° problema.
   FrmModArt.QProductos.FieldByName('FechaCompra').Text:= sDateEdit1.Text;  /// acá el 3° problema.
   ...
   FrmModArt.QProductos.Post; /// acá se guarda los datos.
   TFormNuevoProducto.EditCodigo.Clear;
   TFormNuevoProducto.EditDescripcion.Clear;                                   /// acá se borra los datos que contiene los componentes.
   TFormNuevoProducto.ComboBoxProveedor.KeyValue := '';
   ...
   TFormNuevoProducto.sDateEdit1.Clear;
   ...
   TFormNuevoProducto.EditCodigo.SetFocus; /// Le devuelve el focus al edit Código.
   except
    on E:Exception do
     begin
      MessageDlg('ErrorN°: 175 ' + E.Message, mtWarning, [mbOK], 0);
     end;
   end;
   end;
 end;
end;
2° en el ComboBoxProveedo y 3° sDateEdit1.Text en cuando intento guardar (sin proveedor y sin fecha) me sale mensaje de error Null.
Aqui mensaje completo del 2°:
Cita:

Could not convert variant of type (Null) into type (OleStr)
Lo que he intentado es por código algo así. Ya q el problema es que no me deja guardar Null (vació) en mi tabla. y en el 3° no me guarda _/_/_.
Código Delphi [-]
if Trim(ComboBoxProveedor.Text) = '' then
    begin
     FrmModArt.QProductos.FieldByName('idProveedor').Value := NULL;

     FrmModArt.QProductos.FieldByName('idProveedor').Text:= ComboBoxProveedor.KeyValue;
    end;
Quiero decirle que SI esta vacío ENTONCES ... haga lo primero SINO lo guarde... (y no puedo hacer eso) Es muy pobre MyCodigo...
Y en el 3° hacer algo similar...
Desde ya muchas gracias y espero no molestarlos con mis PREGUNTONTAS... :D

Casimiro Notevi 09-06-2018 20:04:22

Para estas cosas es perfecto el libro este. Te harás un experto si acudes al mismo.
Para cosas como esta:
Código Delphi [-]
FrmModArt.QProductos.FieldByName('FechaCompra').Text:= sDateEdit1.Text;  /// acá el 3° problema.
La base de datos debe tener el campo FechaCompra del tipo fecha, según la base de datos que utilices será date, datetime, timestamp, etc.
Y pondrías algo así:
Código Delphi [-]
......QProductos.FieldByName('FechaCompra').DateTime := ......
Porque no creo que estés guardando las fechas en modo texto, imagino.

DiegoPucho 09-06-2018 20:44:50

gracias Casimiro, siempre estas pendiente... espero no ofenderte... el libro ya lo descargue, se me complica leerlo desde la maquina... (soy mas chapada a la antigua: Papel). Pero ya me voy a poner a leerlo...
Cita:

Porque no creo que estés guardando las fechas en modo texto, imagino.
Buen punto. (.) Mayusculo. :D . No se puede guardar en modo texto.??? Por que??? Preguntas facultativas. :rolleyes:

FrmModArt.QProductos.FieldByName('idProveedor').Text: -> Pasaría lo mismo??

Casimiro Notevi 09-06-2018 22:47:06

Si quieres, por ejemplo, calcular cuántos días han pasado entre varias fechas, o mostrar registros ordenados por fecha, o sumar/restar fechas, etc. lo ideal es guardar fechas. (Una fecha es realmente un número con decimales, por lo que facilita hacer cálculos con ellas).
El código del proveedor normalmente será un número, aunque si usas letras, tendrás que guardarlo como varchar.

Ten en cuenta que la estructura de la base de datos es como la estructura de un edificio, sus cimientos, columnas, etc.
Y el programa es como las paredes, que puedes poner en un sitio u otro, pintar de distintos colores, etc.

Pero con una buena estructura siempre tendrás una buena base para tu programa/edificio. Si la estructura es mala, luego te encontrarás con problemas, se puede derrumbar/caer, no podrás poner más plantas/pisos, no podrás mover paredes, etc.

La estructura es esencial.
Lee el libro ;)

DiegoPucho 10-06-2018 01:32:05

Hola casimiro de nuevo, pero en la propiedad que mencionas:
Código Delphi [-]
......QProductos.FieldByName('FechaCompra').DateTime := ......
No me sale la propiedad DateTime, solo AsDateTime... (es lo mismo?)
De la forma que estaba me guarda el valor, el problema es cuando esta vació el campo. Si lo guarda no creo que sea el problema de como lo guardo.
Quiero decirle que si esta vació.... entonces... desactivarlo... sino guardarlo... (Pero no puedo)...
Código Delphi [-]
if Trim(ComboBoxProveedor.Text) = '' then
    begin
     FrmModArt.QProductos.FieldByName('idProveedor').Value := NULL;
/// Acá no se que poner (if vacio the Null sino que lo guarde). 
     FrmModArt.QProductos.FieldByName('idProveedor').Text:= ComboBoxProveedor.KeyValue;
    end;

Y ya lo estoy leyendo al Libro... Espero que me ayuden...

DiegoPucho 10-06-2018 08:25:47

hice traducción del else mal... es sino...
ya solucione el 1° así:
Código Delphi [-]
if Trim(ComboBoxProveedor.Text) = '' then
    begin
     FrmModArt.QProductos.FieldByName('idProveedor').Value := NULL;
    end
else
    begin
     FrmModArt.QProductos.FieldByName('idProveedor').Text:= ComboBoxProveedor.KeyValue;
    end;

Pero no lo consigo con el 2° lo hice igual y nada...:(

DiegoPucho 10-06-2018 09:49:34

Guardar un DateEdit en base de Datos
 
Logre solucionar el 2° Problema de la siguiente manera:
Código Delphi [-]
if sDateEdit1.Text = ('  /  /    ') then
    begin
     FrmModArt.QProductos.FieldByName('FechaCompra').Value := NULL;
    end
else
    begin
     FrmModArt.QProductos.FieldByName('FechaCompra').Text:= sDateEdit1.Text;
    end;
Espero que a alguien le sirva...:D

Casimiro Notevi 10-06-2018 14:07:20

Cita:

Empezado por DiegoPucho (Mensaje 526984)
No me sale la propiedad DateTime, solo AsDateTime... (es lo mismo?)

No recuerdo de memoria, es que estoy cambiando de lenguajes durante todo el día, de unos a otros. Sí, será asdatetime.


La franja horaria es GMT +2. Ahora son las 09:28:51.

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