PDA

Ver la Versión Completa : Traer un valor de un campo de la Tabla (Access) incluso si esta vacia


nefore
16-06-2013, 07:34:55
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:

CREATE TABLE PARAMETROS(
ULTIMO_PROPIETARIO INTEGER,
ULTIMO_VETERINARIO INTEGER,
etc,
...
);


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:

...
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.

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
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:

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:

...
Add(ADOTable1['Field1']);

Al ser un Variant no es necesario especificar el tipo.

Saludos. :)