Cita:
Empezado por Galbi
Cuando pregunto por los CodInterno y CodBarras es, qué resultaría mas conveniente, si definirlos como Nun o Char en función a poder luego, realizar consultas con comodines (por lo que estuve probando LIKE y % solo funcionan en campos Char o estoy equivocado?)
|
Pues ya ves, esto depende entonces de que típo de búsquedas querras hacer, y de las capacidades de tu motor. Si usas firebird, por ejemplo, nada te impide realizar una búsqueda con un like sobre un campo numérico, aunque eso podría tener un alto cósto en el desempeño de la BD, pues se ve obligada a realizar las conversiones de tipo. Probá lo siguiente:
Código SQL
[-]
Create table prueba(codigo integer not null primary key);
insert into prueba values (1);
insert into prueba values (10);
insert into prueba values (100);
insert into prueba values (1000);
insert into prueba values (2);
insert into prueba values (20);
insert into prueba values (200);
insert into prueba values (2000);
insert into prueba values (3);
insert into prueba values (30);
insert into prueba values (300);
insert into prueba values (3000);
commit;
select *
from prueba
where codigo like '1%';
select *
from prueba
where codigo like '2%';
select *
from prueba
where codigo like '%0%';
select *
from prueba
where codigo like '%000';
Cita:
Empezado por Galbi
En cuanto a si usar un TQuery o varios es por que no se como hacer para diferenciar que tipo de input hace el usuario (CodInterno, CodBarra o Descripción), intenté hacer que busque primero en uno luego en otro, etc. pero me dá error de type mismatch.
|
de forma muy simple, y suponiendo que edit1 es el "input" del usuario, podrias hacer algo como:
Código Delphi
[-]
Query1.ParamByName('CodigoBarras').AsString := Edit1.Text;
Query1.Open;
try
if Query1.IsEmpty then
begin
Query2.ParamByName('Codigo').AsString := Edit1.Text;
Query2.Open;
try
if Query2.IsEmpty then
begin
Query3.ParamByName('Descripcion').AsString := Edit1.Text + '%';
Query3.Open;
if Query3.IsEmpty then
raise Exception.Create('Error: no hay un artículo que coincida!')
else
result := NavegarPorLosRegistrosCoincidentesEnQuery3;
end
else
result := Query2ID_ARTICULO.AsInteger;
finally
Query2.Close;
end;
end
else
result := Query1ID_ARTICULO.AsInteger;
finally
Query1.close;
end;
Puede que ni compile... pero ya tenes la idea.
Saludos.