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)
-   -   Traer un valor de un campo de la Tabla (Access) incluso si esta vacia (https://www.clubdelphi.com/foros/showthread.php?t=83418)

nefore 16-06-2013 07:34:55

Traer un valor de un campo de la Tabla (Access) incluso si esta vacia
 
Hola

(Iba a colocar esta pregunta en el primer tema que hice, pero lo considero como un tema aparte, asi que...)

¿Como haria para traer un valor de un campo de la BD y que pasaria si este campo estaria vacio?
Por ejemplo: Tengo una Base de Datos la cual contiene varias tablas: Propietarios, Veterinarios, Inspectores, y una llamada Parametros
Tanto los propietarios, como los veterinarios y los inspectores, tienen su respectivo codigo (Codigo_propietario, etc.)
Ahora bien, cuando realizo un alta el codigo a generar para el nuevo propietario, estara almacenado en la tabla Parametros (la cual contiene campos tales como ULTIMO_PROPIETARIO, ULTIMO_VETERINARIO, etc. Y un solo registro en el cual esta almacenado en cada uno de sus campos, el ultimo codigo del tipo de persona a la cual haya cargado en el sistema)
Lo que debo hacer (para hacer un alta de propietario) es traer el valor del campo ULTIMO PROPIETARIO, incrementarlo en 1 (y ese sera el codigo de la persona), cuando grabo los datos en la tabla propietarios, tambien grabo el codigo en la Tabla Parametros.
A todo esto:
Como se escribe una sentencia que permita traerme un dato de una tabla y pasarlo a una variable a partir de un ADOTable?

ecfisa 16-06-2013 08:54:30

Hola nefore.

Por lo que entiendo tenes una tabla de un solo registro donde se almacenan los últimos identificadores que corresponden a cada tabla, algo como:
Código SQL [-]
CREATE TABLE PARAMETROS(
  ULTIMO_PROPIETARIO INTEGER,
  ULTIMO_VETERINARIO INTEGER,
  etc,
  ...
);

Cita:

Como se escribe una sentencia que permita traerme un dato de una tabla y pasarlo a una variable a partir de un ADOTable?
Te pongo un ejemplo de ingreso, para él mismo, agrega otro TADOTable vinculado a la tabla PARAMETROS.

Suponiendo que el ADOTable vinculado a veterinarios se llama tbVeterinario, el vinculado a parámetros se llama tbParametros y sus campos fueron iniciados a cero, las acciónes básicas a seguir serían:
Código Delphi [-]
...
var
  Ultimo : Integer;
begin
  // Obtener el último ID de veterinario de la tabla "Parametros"
  // incrementarlo en uno y almacenarlo en la variable Ultimo
  Ultimo :=  tbParametros.FieldByName('ULTIMO_VETERINARIO').Value + 1;

  // Agregar un registro en tabla "Veterinarios"
  tbVeterinarios.Insert;
  // Asignarle el ID (Codigo) de veterinario
  tbVeterinarios.FieldByName('Codigo_Veterinario').Value := Ultimo;
  { Asignar los demás valores del veterinario
  ...
  ...
  }
  tbVeterinarios.Post;  // Guardar

  // Actualizar ultimo veterinario en tabla "Parametros"
  tbParametros.Edit;
  tbParametros.FieldByName('ULTIMO_VETERINARIO').Value := Ultimo;
  tbParametros.Post; // Guardar
  ...
end;

Saludos. :)

nefore 16-06-2013 09:02:01

Vaya, es lo que estaba buscando (en VB 6.0 tenia el Adotable.Columns) y no sabia como hacer algo parecido aca en Delphi. Lo probrare. Muchas gracias por tus respuestas me han ayudado mucho :)^\||/

nefore 16-06-2013 22:39:24

Hola he intentando el codigo que me has puesto, y funciona de maravilla (lo he intentado con el campo (ULTMO_PROPIETARIO) el problema es que al guardar ese valor en el campo parametro, me salta un error pidiendome que le agregue un valor a los demas campos (ULTIMO_INSPECTOR, ULTIMO_VETERINARIO, etc.), me he fijado en la BD de Access y existe una propiedad que dice 'Requerido' (Hacer obligatoria la entrada de este campo') le he puesto que no, pero aun asi, me pide que le ingrese valor a los demas campos.

Código Delphi [-]
procedure TForm5.FormCreate(Sender: TObject);
begin
parametro.conectaBD;
parametro.conectatabla;
if (ADOTable4.FieldByName('ULTIMO_TITULAR').Value <> null) then
  codigo.Text := (IntToStr((ADOTable4.FieldByName('ULTIMO_TITULAR').Value)+1))
else
 codigo.Text:= IntToStr(1);

fecha.Text := DateToStr(Now);
end;

//el siguiente codigo se encuentra cuando en el evento click de un boton para grabar los datos

if bandera then
  begin
    propietario.conectaBD;
    propietario.ConectaTabla(1);
    if (propietario.busqueda(dni.Text,0,2)=True)then
    begin
     ShowMessage('Esta persona ya se encuentra cargada en el sistema');
     dni.SetFocus;
     dni.SelectAll;
     end
    else
    begin
      ADOTable4.Last;
      ADOTable4.Edit;
      ADOTable4.FieldByName('ULTIMO_TITULAR').AsInteger := StrToInt(codigo.Text);
      ADOTable4.Post;
      propietario.Desconectar;
      propietario.grabardatos;
      propietario.Free;
      validacion.Free;
      if MessageDlg('Continuar ingresando datos?', mtConfirmation, [mbYes, mbNo], 0) = mrYes
      then
      begin
        if (ADOTable4.FieldByName('ULTIMO_TITULAR').Value <> null) then
        codigo.Text := (IntToStr((ADOTable4.FieldByName('ULTIMO_TITULAR').Value)+1))
        else
        codigo.Text:= IntToStr(1);
        Limpiar;
      end
      else
      begin
       Close;
       parametro.desconectar;
      end;

    end;
  end;


en donde bandera es una que utilizo para manejar las validaciones (si esta es verdadera significa que las validaciones son correctas), propietario es una clase y el ADOTABLE4 pertenece al AdoTable asociado con la tabla parametros.

ecfisa 16-06-2013 22:45:58

Cita:

Empezado por nefore (Mensaje 462316)
Vaya, es lo que estaba buscando (en VB 6.0 tenia el Adotable.Columns) y no sabia como hacer algo parecido aca en Delphi. Lo probrare. Muchas gracias por tus respuestas me han ayudado mucho :)^\||/

Hola nefore.

En Delphi tenes más de una forma de acceder a las columnas de una tabla:
  • El campo persistente. (doble click sobre ADOTable->click derecho->Add fields/Add all fields)
  • La función FieldByName.
  • La propiedad vectorial Fields (mediante el índice de posición de la columna en el TDataSet).
  • La propiedad vectorial FieldValues.

Un ejemplo en que se muestra el valor de un mismo campo de los modos anteriores:
Código Delphi [-]
  with ListBox1.Items do
  begin
    Add(ADOTable1Field1.AsString);  // campo persistente
    Add(ADOTable1.FieldByName('Field1').Value); 
    Add(ADOTable1.Fields[0].AsString);
    Add(ADOTable1.FieldValues['Field1']); //(*)
  end;
(*) FieldValues es la propiedad vectorial por omisión (default), por lo que se puede escribir:
Código Delphi [-]
   ...
   Add(ADOTable1['Field1']);
Al ser un Variant no es necesario especificar el tipo.

Saludos. :)


La franja horaria es GMT +2. Ahora son las 16:24:12.

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