Вы находитесь на странице: 1из 92

FORO DELPHI

Serializacin de facturas y albaranes con Delphi


En este artculo os explicamos paso a paso, con capturas de pantalla y con todas las explicaciones
necesarias cmo implementar en nuestras aplicaciones las facturas serializadas, segn la serie
elegida la aplicacin generar el contador correspondiente. Utilizaremos Delphi como lenguaje de
programacin, aunque es aplicable a cualquier lenguaje de programacin.
Serializacin de facturas y albaranes con Delphi
La serializacin de facturas y albaranes es una prctica muy comn en casi todas las empresas que
requieren de una aplicacin de facturacin. Por ejemplo, se recomienda que las facturas de abono
tengan su propio contador, independiente del contador general de las facturas "normales". Para
implementar esta distincin en una aplicacin informtica podremos utilizar la serializacin que,
adems, nos servir para otros muchos usos. Por ejemplo, para llevar contadores independientes
segn el tipo de factura.
Como ya hemos comentado, utilizaremos Delphi cmo lenguaje de programacin y MySQL como
motor de base de datos. Aunque la base de este manual sirve para cualquier lenguaje de
programacin (con los cambios pertinentes) y para cualquier motor de base de datos.
En primer lugar necesitaremos dos tablas en la base de datos para guardar los contadores y las series
de las facturas/albaranes. En una tabla guardaremos las series disponibles y la tabla a la que se
podrn asignar, a continuacin os mostramos el script sql necesario para crearla:
CREATE TABLE serie (
codigo int(10) unsigned NOT NULL auto_increment,
nombre char(2) NOT NULL,
tabla varchar(50) NOT NULL,
PRIMARY KEY (codigo),
UNIQUE KEY serie_tabla_nombre USING BTREE (nombre, tabla)
)
Por otro lado necesitaremos una segunda tabla donde se guardar el nmero por el que va cada serie
de cada tabla, con el script sql siguiente:
CREATE TABLE contador (
codigo int(10) unsigned NOT NULL auto_increment,
tabla varchar(100) NOT NULL,
contador int(10) unsigned,
serie char(2) NOT NULL,
PRIMARY KEY USING BTREE (codigo),
UNIQUE KEY contador_tabla_serie USING BTREE (tabla, serie)
)
Lgicamente necesitaremos tambin una tabla para alojar las facturas, con el siguiente script sql de
creacin:
CREATE TABLE factura (
codigo int(10) unsigned NOT NULL auto_increment,
numexpediente varchar(15),

numerofactura varchar(25) NOT NULL,


serie char(2) NOT NULL,
codigocliente int(10),
matricula varchar(35),
cobrado char(1),
fechacobro datetime,
importetotal float,
clientecontacto varchar(100),
fechacarga datetime,
telefono varchar(40),
email varchar(100),
observacion varchar(255),
porcentajebeneficio float,
importebeneficio float,
importetransportista float,
codigotransportista int(10),
pagadotransportista char(1),
fechapagotransportista datetime,
codusuarioa int(10) unsigned,
codusuariom int(10) unsigned,
fechaa datetime,
fecham datetime,
pesonetototal float,
envasestotales float,
paletstotales float,
fecha datetime,
fechavencimiento datetime,
PRIMARY KEY USING BTREE (codigo),
UNIQUE KEY factura_numerofactura USING BTREE (numerofactura, serie)
)
En la tabla "factura", podremos observar que los dos campos utilizados para la serializacin son
"numerofactura" y "serie".
Para crear estas tablas podremos utilizar la aplicacin AjpdSoft Administracin Bases de Datos.
Una vez creadas las tablas necesarias en la base de datos para la serializacin de las facturas y
albaranes, pasaremos ahora a explicar cmo programar cada opcin en la aplicacin que estemos
desarrollando:
Crearemos un formulario para la insercin y modificacin de las series de la factura:

Se trata del formulario donde podremos introducir la Serie y la Tabla para la que la utilizaremos, en
nuestro caso para la tabla "Factura". Los componentes de este formulario estarn enlazados con la
tabla "Serie" creada anteriormente.
Crearemos un formulario para la insercin y modificacin de los contadores:

Este formulario contendr los controles enlazados con la tabla "Contador" creada anteriormente.
Este formulario mostrar el contador (nmero) y la serie, ambos se generarn de forma automtica
desde el formulario de la factura. Desde este formulario podremos modifcarlos en caso necesario.
Crearemos un formulario para la insercin y modificacin de las facturas:

En este formulario ser donde utilicemos las series y el contador, a continuacin os mostramos el
cdigo fuente en Delphi del cdigo que insertaremos en el evento OnClick del botn
bGenerarNumFactura que es el que hay en la parte derecha del campo del nmero de factura. Este
botn generar el nmero de forma automtica segn la serie introducida en el campo anterior
(txtSerie):
procedure TformGFactura.bGenerarNumFacturaClick(Sender: TObject);
var
ano, mes, dia : word;
begin
if txtSerie.Text = '' then

begin
MessageDlg('La serie de la factura debe tener un valor.', mtWarning, [mbok], 0);
txtSerie.SetFocus;
end
else
begin
decodeDate(now, ano, mes, dia);
md.tFacturanumerofactura.AsString := llenarCadena(floattostr(generarNumeroSerie (
txtSerie.Text, vtTablaFactura)),6,'0', false) + '/' + inttostr(ano);
end;
end;
Donde:
txtSerie: es el TDBComboBox que contendr un desplegable con las series disponibles para
la tabla actual (Facturas).
md.tFactura: es el componente TTable enlazado con la tabla "Facturas", donde se guardan
los datos de la factura.
llenarCadena: es una funcin que rellena una cadena dada con el carcter indicado y con el
tamao indicado. A continuacin os mostramos el cdigo de esta funcin:
function llenarCadena ( cadena : string; numero : integer;caracter : Char;
derecha : Boolean) : string;
begin
while Length(cadena) < numero do
begin
if derecha then
cadena := cadena + caracter
else
cadena := caracter + cadena;
end;
llenarCadena := cadena;
end;
Esta funcin generar un nmero con el formato: 000032/2007.
generarNumeroSerie: esta funcin accede a la tabla "Contador" y obtiene el nmero por el que vaya
el contador segn la serie y la tabla que se le pase como parmetro. Tambin incrementa el contador
de esta tabla y serie. El cdigo de esta funcin es el siguiente:
function generarNumeroSerie (serie, tabla : string) : integer;
var
contador : integer;
begin
result := 1;
with md.tcContador do
begin
Close;
//obtenemos el contador de la tabla contadores
SQL.Clear;

SQL.Add('SELECT *');
SQL.Add('FROM ' + vtTablaContador);
SQL.Add('WHERE tabla = :pTabla and serie = :pSerie');
ParamByName('pTabla').DataType := ftString;
ParamByName('pTabla').AsString := tabla;
ParamByName('pSerie').DataType := ftString;
ParamByName('pSerie').AsString := serie;
Open;
if not (FieldByName('Contador').AsInteger = 0) then
begin
try
contador := FieldByName('contador').AsInteger + 1;
//Incrementamos el contador de la tabla contadores
Close;
SQL.Clear;
SQL.Add('UPDATE ' + vtTablaContador + ' SET contador = :pContador' +
' WHERE tabla = :pTabla' + ' and serie = :pSerie');
ParamByName('pContador').DataType := ftInteger;
ParamByName('pContador').AsInteger := contador;
ParamByName('pTabla').DataType := ftString;
ParamByName('pTabla').AsString := tabla;
ParamByName('pSerie').DataType := ftString;
ParamByName('pSerie').AsString := serie;
ExecSQL;
close;
result := contador;
except
Close;
result := 1;
MessageDlg ('El cdigo no ha podido ' + 'generarse automticamente.',mtError, [mbOK], 0);
end;
end
else
//si no existe el registro de contador para la tabla actual, lo creamos
begin
try
Close;
SQL.Clear;
SQL.Add('INSERT INTO ' + vtTablaContador + ' (tabla, serie, contador) ' +
' VALUES (:pTabla, :pSerie, 1)');
ParamByName('pTabla').DataType := ftString;
ParamByName('pTabla').AsString := tabla;
ParamByName('pSerie').DataType := ftString;
ParamByName('pSerie').AsString := serie;
ExecSQL;
result := 1;
Close;
except
Close;
MessageDlg ('El contador no se ha ' + 'guardado correctamente.',mtError, [mbOK], 0);

end;
end;
end;
end;
Donde:
md.tcContador: es el TTable enlazado con la tabla "Contador", donde se guarda un registro por
cada serie y factura con el nmero por el que vaya actualmente el contador. La aplicacin
funcionando tendr este aspecto:

Splash Screens en Delphi


Las Splash Screens son la pantallas de carga de los programas, algunas tardan segundos y
otras minutos, dependiente si la aplicacin tiene un peso considerable para nuestra
computadora, tambin se caracterizan por incluir una imagen o una barra de carga para
saber cuando se inicializara el entorno para el usuario.
Primer paso
Agregamos un form nuevo en el proyecto File->New->Form
Le ponemos un nombre fcil de recordar name: SplashForm
Normalmente las Splash Screens no tienen borde y estn centradas en la pantalla
bordestyle: bsNone
position: poScreenCenter
Despus agregamos una imagen con el control Timage y asignamos la fotografa en la
propiedad picture, para que se ajuste a la imagen poner autosize: true tambin al
SplashForm autosize: true con esto hacemos que el splashscreen tenga el mismo tamao
que la imagen
Segundo paso:
Tendremos que decir a Delphi que nuestra aplicacin no la auto cree como las otras, por
eso vamos a Project->Options Pestaa Forms, Seleccionamos splashForm y la ponemos a
AVailable forms
Vamos al cdigo del poyecto Project->View Source. Tenemos que tener parecido a esto
program Project1;
uses
Forms,
Unit1 in Unit1.pas {Form1},
Unit2 in Unit2.pas {SplashForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Tercer paso:
Nuestra splash screen se debe crear antes de todos los dems form, y al terminar la carga de
las forms, esconderla y liberar su memoria
begin
SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
SplashForm.Update;
Ahora tenemos que poner los forms que se deben cargar al inicio
Application.CreateForm(TForm1, Form1);
Antes que nuestra applicacin muestre la pantalla principal tenemos que, esconder la splash
screen y liberar su memoria
SplashForm.Hide;
SplashForm.Free;
Application.Run;
Finalizando:
Si compilamos veremos que nuestra splash screen no tiene tiempo de aparecer, si queremos
que se muestre unos segundos, agregamos la siguiente lnea antes de SplashForm.Hide
Sleep(2000);
Funcin Sleep es de la unidad SysUtils, para poderla utilizar debemos cargarla en uses del
proyecto
uses
Forms, Unit1 in Unit1.pas {Form1}, Unit2 in Unit2.pas {SplashForm}, SysUtils;
Ya podemos compilar y ver nuestra primera splash screen

Configurar o Firewall do Windows XP com SP2 para Interbase/Firebird


O pacote de atualizao Service Pack 2 (SP2) do Windows XP inclui um Firewall para proteo da rede
contra acesso no autorizado, seja pela internet ou atravs da rede local. Este programa bloqueia
automaticamente quase todas as portas de acesso do protocolo TCP/IP, incluindo a porta 3050 que por
padro usada pelos bancos de dados Interbase e Firebird.
Ento para que outros computadores possam acessar um banco de dados Interbase ou Firebird em um
servidor com Windows XP com SP2 que esteja com Firewall ativado necessrio adicionar uma exceo,
ou seja, informar ao Firewall que a porta 3050 no deve ser bloqueada. Para fazer isto siga os os passos
abaixo:
Clique em Iniciar/Configuraes/Painel de controle;
Abra o item denominado Firewall do Windows;
V para Excees;
Clique em Adicionar porta;
No campo Nome digite Firebird ou Interbase;
No campo Nmero da Porta digite 3050;
Escolha o protocolo TCP e clique em Ok.
Aps este procedimento a porta 3050 estar desbloqueada e o banco de dados Interbase ou Firebird estar
acessvel atravs da rede.

Listar as tabelas e views do banco de dados


Tabelas e views:
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS;

Somente tabelas:
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE RDB$VIEW_BLR IS NULL;

Somente views:
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE NOT RDB$VIEW_BLR IS NULL;

Observao:
Para no incluir as tabelas e views de sistema, acrescente o filtro (RDB$SYSTEM_FLAG = 0 OR
RDB$SYSTEM_FLAG IS NULL) na clusula WHERE. Exemplo:
SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE RDB$VIEW_BLR IS NULL AND (RDB$SYSTEM_FLAG = 0 OR RDB$SYSTEM_FLAG IS NULL);

Backup e restore com gbak


O InterBase/FireBird possui uma ferramenta de linha de comando especfica para fazer e restaurar cpias de
segurana (backup). No Windows o nome do programa gbak.exe e no Linux seu nome gbak (sem
extenso). Em ambos os sistemas a localizao deste arquivo o sub-diretrio bin do InterBase/FireBird.
As sintaxes bsicas deste comando so:
Para fazer um backup:
gbak -b -user usuario -password senha arquivo_banco arquivo_backup

Para restaurar um backup:


gbak -r -user usuario -password senha arquivo_backup arquivo_banco

Onde:
usuario: o nome de login do usurio (geralmente SYSDBA).
senha: a senha do usurio.
arquivo_banco: o arquivo de banco de dados (geralmente com extenso .gdb).
arquivo_backup: o arquivo de backup (geralmente com extenso .gbk).
Exemplo de backup:
gbak -b -user SYSDBA -password masterkey c:\sistema\dados.gdb c:\backup\dados.gbk

Exemplo de restore:
gbak -r -user SYSDBA -password masterkey c:\backup\dados.gbk c:\sistema\dados.gdb

Obter o valor de um generator


Para obter o valor de um generator devemos usar a funo GEN_ID do InterBase/FireBird. A sintaxe :
GEN_ID(NomeDoGenerator, Incremento);

Exemplos:
GEN_ID(Gen_Cliente_Codigo, 1);
GEN_ID(Gen_Cliente_Codigo, 0);

No primeiro exemplo o generator ser incrementado e o novo valor ser retornado. J no segundo exemplo o
generator no ser incrementado e seu valor atual ser retornado.
Dentro de um trigger podemos atribuir o valor de um generator a um campo da tabela, como mostra o
exemplo a seguir:
CREATE TRIGGER TRIG_Cliente_Inclusao FOR Cliente BEFORE INSERT AS
BEGIN
NEW.Codigo = GEN_ID(Gen_Cliente_Codigo, 1);
END^

Para obter o valor de um generator atravs de uma aplicao, podemos executar o comando SELECT
mostrado a seguir sobre uma tabela que possua apenas um registro:
SELECT GEN_ID(NomeDoGenerator, 1) FROM NomeTabela

Onde NomeTabela o nome de uma tabela do banco de dados que precisa ter um, e somente um, registro.
Geralmente usamos a tabela de sistema RDB$DATABASE para este propsito. Eis um exemplo:
SELECT GEN_ID(Gen_Cliente_Codigo, 1) FROM RDB$DATABASE;

Reiniciar a contagem de um generator


Para re-iniciar a contagem de um generator basta executar o comando abaixo:
SET GENERATOR TO X;

Onde X um nmero inteiro.


O exemplo abaixo define o valor do generator GEN_Cliente_Codigo igual a zero:
SET GENERATOR GEN_Cliente_Codigo TO 0

Observao:
O valor obtido com GEN_ID(GEN_Cliente_Codigo, 1) aps o exemplo dado anteriormente ser 1 (um),
pois a funo GEN_ID retorna o valor do generator j incrementado.

Excluir generator
No InterBase 6.0.x:
DELETE FROM RDB$GENERATORS
WHERE RDB$GENERATOR_NAME = 'NOME_DO_GENERATOR';

No FireBird:
DROP GENERATOR NOME_DO_GENERATOR;

Criar e usar domnios (domain's)


No InterBase e FireBird domnios so como tipos de dados. Tais domnios tm grande semelhana com o
conceito de domnio aplicado matemtica, ou seja, um domnio define um conjunto de valores vlidos para
uma dada situao.
Podemos criar qualquer banco de dados sem fazer uso explcito de domnios. No entanto usar domnios
explicitamente pode deixar o banco de dados mais organizado, com regras claras e bem definidas, e ainda
conseguir uma economia substancial de mo de obra na construo e manuteno do banco.
Para demonstrar a utilidade dos domnios, vamos criar dois exemplos.

Exemplo 1 - Sem uso explcito de domnios:


CREATE TABLE Cliente(
Codigo INTEGER NOT NULL,
Nome
VARCHAR(40) NOT NULL,
Fone
VARCHAR(20),
Fax
VARCHAR(20),
Celular VARCHAR(20),
Renda
NUMERIC(9,2) DEFAULT 0 NOT NULL,
CONSTRAINT PK_Cliente PRIMARY KEY(Codigo),
CONSTRAINT CHK_Cliente_Codigo CHECK(Codigo > 0),
CONSTRAINT CHK_Cliente_Renda CHECK(Renda >= 0));

Exemplo 2 - Com uso explcito de domnios:


CREATE
CREATE
CREATE
CREATE

DOMAIN
DOMAIN
DOMAIN
DOMAIN

DM_ChavePrimaria INTEGER NOT NULL CHECK(VALUE > 0);


DM_NomePessoa VARCHAR(40) NOT NULL;
DM_Fone VARCHAR(20);
DM_Renda NUMERIC(9,2) DEFAULT 0 NOT NULL CHECK(VALUE >= 0);

CREATE TABLE Cliente(


Codigo DM_ChavePrimaria,
Nome
DM_NomePessoa,
Fone
DM_Fone,
Fax
DM_Fone,
Celular DM_Fone,
Renda
DM_Renda,
CONSTRAINT PK_Cliente PRIMARY KEY(Codigo));

Comentrios:
O benefcio imediato do uso explcito de domnios a organizao do cdigo que define as tabelas.
Como um mesmo domnio ser usado em vrias tabelas (exemplo: DM_NomePessoa), ganharemos
muito tempo ao definir outras tabelas que comporo o banco de dados.
O domnio DM_Fone um exemplo que demonstra como um mesmo domnio pode ser usado para
colunas diferentes que possuem contedos semelhantes.
Os domnios DM_ChavePrimaria e DM_Renda mostram aspectos mais interessantes na declarao
de domnios, tais como a especificao de um valor padro (DEFAULT) e regras para validao
(CHECK).
Se mais tarde resolvermos alterar os nomes de pessoas para 50 caracteres, ou seja, VARCHAR(50),
bastar alterar a definio do domnio DM_NomePessoa e todos os campos definidos com este
domnio sero automaticamente ajustados. Neste caso bastaria o comando ALTER DOMAIN
DM_NomePessoa TYPE VARCHAR(50).
Nos bancos de dados que crio, uso domnios explicitamente para todos os campos de todas as tabelas,
mesmo onde aparentemente so desnecessrios. Mas bom lembrar que domnios mal definidos podem
trazer mais prejuzos do que benefcios. Portanto, antes de sair criando domnios deliberadamente, faa
um estudo minucioso do banco de dados a ser construdo.

Trocar o tipo de um campo


Para alterar o tipo de um campo no FireBird (ou InterBase 6.0 ou superior) execute o comando SQL abaixo:
ALTER TABLE NomeDaTabela ALTER NomeDoCampo TYPE NovoTipo

Exemplos:
ALTER TABLE Cliente ALTER Nome TYPE VARCHAR(40);
ALTER TABLE Venda ALTER Total TYPE NUMERIC(18, 2);

Obs:
Em geral este comando no funciona se a troca de tipo implicar em perda de dados.
Sugesto:
Onde aparece NovoTipo voc poder usar um nome de domnio.

Alterar o tamanho de um campo


Para alterar o tamanho de um campo CHAR ou VARCHAR no FireBird (ou InterBase 6.0 ou superior)
basta executar o comando SQL abaixo:
ALTER TABLE NomeDaTabela ALTER NomeDoCampo TYPE NovoTipo;

Exemplo:
ALTER TABLE Cliente ALTER Nome TYPE VARCHAR(50);

Obs:
Este comando no funciona se a alterao de tamanho implicar em perda de dados, ou seja, no serve para
reduzir o tamanho de um campo.

Transao multi-banco com IBX


Embora seja um recurso pouco conhecido, o InterBase/FireBird suporta uma nica transao vinculada a
dois ou mais bancos e os componentes InterBase Express (IBX) suportam este recurso de forma
transparente. Para usar este recurso com IBX siga os passos abaixo:
Coloque um IBDatabase para cada banco de dados.
Coloque apenas um IBTransaction.
Conecte cada IBDatabase ao IBTransaction pela propriedade DefaultTransaction.
Coloque quantos IBSQL ou IBDataSet forem necessrios.
Conecte cada IBSQL ou IBDataSet ao respectivo IBDatabase pela propriedade Database.
Conecte cada IBSQL ou IBDataSet ao mesmo IBTransaction pela propriedade Transaction.
Pronto, agora s trabalhar normalmente.
Importante
Deixe a propriedade DefaultDatabase do IBTransaction sem preencher.

Sugesto
Use esta tcnica sempre que precisar transferir dados de um banco de dados para outro.

Excluir cdigo-fonte de stored procedure


Uma grande preocupao que tem tomado conta da cabea de muitos programadores a possibilidade de um
programador concorrente pegar o cdigo-fonte das stored procedures armazenadas em banco de dados
InterBase/FireBird. Uma soluo encontrada apagar o cdigo-fonte diretamente da tabela de sistema onde o
InterBase grava as informaes relativas s stored procedures. Para fazer isto execute o comando abaixo:
UPDATE RDB$PROCEDURES SET RDB$PROCEDURE_SOURCE = 'empty'

Observaes
A mesma coisa pode ser feita com triggers. No entanto importante lembrar que voc no deve atribuir
NULL, pois havia um bug no InterBase que fazia o trigger ser disparado duas vezes caso o cdigo-fonte
estivesse NULL. No sei se o bug foi corrigido. De qualquer forma, atribua uma string qualquer, tal como no
exemplo acima.

Obter os campos da chave-primria


Execute o comando SELECT abaixo para obter os nomes dos
campos da chave-primaria de uma tabela do InterBase ou
FireBird.
SELECT RDB$FIELD_NAME
FROM
RDB$RELATION_CONSTRAINTS C,
RDB$INDEX_SEGMENTS S
WHERE
C.RDB$RELATION_NAME = 'NomeDaTabela' AND
C.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY' AND
S.RDB$INDEX_NAME = C.RDB$INDEX_NAME
ORDER BY RDB$FIELD_POSITION

Observaes
Estes objetos com nomes iniciados com RDB$ so chamados de objetos de sistema e so usados internamente
pelo InterBase/FireBird. As tabelas comeadas com RDB$ contm dados sobre a estrutura do banco de
dados.

Definir forced writes usando o gfix


Para mudar a propriedade "Forced Writes" de um banco de dados
InterBase usando o gfix faa:
Para ativar:
gfix banco -write sync -user sysdba -password senha
Para desativar:
gfix banco -write async -user sysdba -password senha

Onde:
banco = Caminho completo do banco de dados (arquivo .gdb).
senha = senha do sysdba.

Observaes
Voc tambm poder usar o IBConsole para alterar esta propriedade.

Definir sweep interval com gfix


Para definir o "sweep interval" de um banco de dados InterBase
usando o gfix, execute:
gfix banco -housekeeping n -user sysdba -password senha
Onde:
banco = Caminho completo do banco de dados (arquivo .gdb).
n = Intervalo de sweep.
senha = senha do sysdba.

Observaes
Voc tambm poder alterar esta propriedade do banco de dados usando o IBConsole.

Obter a data do servidor


Isto facilmente possvel se voc usa um banco de dados Client/Server, tal como
Interbase, SQL Server, Oracle, etc. No Interbase6 execute a Query abaixo:
SELECT CURRENT_DATE FROM RDB$DATABASE;
O resultado a data do servidor onde est rodando o Interbase Server.

Instalar ZeosDBO 6.6.4 en Delphi 2007


Nos dirigimos a la carpeta Packages y abrimos el fichero ZeosDbo.groupproj de la
carpeta delphi11. Ahora seleccionamos la librera ZCore110.bpl, y con el botn derecho
del mouse, hacemos build all from here. Esto nos crear los ficheros .dcu en la carpeta
build dentro de la carpeta delphi11.
Ahora, aadimos las carpetas en la configuracin del proyecto. Nos dirigimos a Tools > Options, Dentro de Library path, introducimos la ruta del build, donde estn todos los
.dcu, y en Browsing path, aadimos la ruta de todas las fuentes.
Ahora, seleccionamos el package ZComponentDesign110.bpl y con el botn derecho
"Install".

Instalacion de RxLib 2.7.7


Tools > Options
Environment Options > Delphi Options > Library Win32;
Library path, clic en el botn con los 3 puntos
Pon la ruta de las units (ejemplo C:\delphi\rxlib-2.7.7\packages\delphi2007) y clic en Add;
Digiten al final $(BDS)\ rxlib-2.7.7 y luego clic en Add;
Ahora abra el archivo Rxlib.groupproj
Project > Compile all projects;
View > Project Manager, haz clic con el botn izquierdo y elije Install, en los 3 archivos:
dclrxbd100.bpl
dclrx100.bpl
dclrxdb100.bpl

Instalacion QuickReport Professional 4.07


Tools > Options
Environment Options > Delphi Options > Library Win32;
Library path, clic en el botn con los 3 puntos
Digiten al final $(BDS)\QuickRep y luego clic en Add;
Component > Install Packages
Clic en el botn Add
Seleccione QR4DesignD2007.bpl y listo.

No ingresar 2 proposiciones
CaracteresValidos = [#1..#31, #8, 'p', 'q', 'r', 's', '<', '>', '(', ')', '^', '-'];
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key In CaracteresValidos) then
begin
Key := #0;
Beep;
end
else
if (key = anterior) then
begin
Key := #0;
Beep;
application.MESSAGEBOX('Imposible ingresar dos proposiciones consecutivas', 'Error!')
end
else
if anterior in CaracteresValidos then
begin
Key := #0;
Beep;
application.MESSAGEBOX('Imposible ingresar dos proposiciones consecutivas', 'Error!')
end
else
anterior := Key;
end;

Validar ingreso de solo nmeros


procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9']) then
begin
Beep;
MessageDlg('Debe ingresar solo nmeros!', mtInformation,[mbOK],0);
end;
end;

Para validar un DBEdit


En el evento OnSetText del TField asociado a ese DBEdit pon:
try
Sender.AsDateTime := Text;
except
on E:Exception do
ErrorDialog('Error en fecha: '+E.Message, E.HelpContext);
end;
En el evento OnExit del control Edit1 pon el cdigo de validacin y si no se cumple lleva el foco al
control. Funciona muy bien.
if Edit1.text= then
begin
ShowMessage(Ingrese texto);
edit1.setfocus;
end;
Para validar un Edit tienes que hacer la validacin en el campo del TTable, para esto primero hace
doble clic sobre el ttable y te aparecer la lista de campos, selecciona el que vas a validar y anda al
object inspector a la pestaa events y da doble clic en onValidate, all podrs escribir la validacin
para dicho campo abortando con "Abort" en el caso que no sea correcto el tipo de dato.
procedure TFrmCliente.Tbl1CuitValidate(Sender: TField);
begin
if Tbl1Cuit.value= then
Abort;
end;

Como validar el precio en un DBtext (Double)


try
StrToFloat(Text); //probamos a convertir
Sender.AsString := Text; // si no hay fallos al convertir, asignamos el nuevo valor
except
ShowMessage('mi fallo');
sysutils.Abort; // excepcin silenciosa.
end;

Como capturar un error de base de datos


if (pass.Text='') or (pass2.Text='') or (nom.Text='') or (userr.Text='') then
begin
guardar.enabled:=false;
application.messagebox('Hay campos vacios','Validacion',mb_ok+mb_iconerror);
end
else
begin
try
tuser.Post;
tuser.First;
pass2.Text:='';
except on E:Exception do begin
application.messagebox('Usuario existente','Validacion',mb_ok+mb_iconerror);
cancelarClick(Sender);
end;
end;
end;

Capturar errores al hacer un Post validar registros


Cuando usamos controles DataAware tales como DBNavigator o DBGrid, y se pueden aadir
registros, es posible que el usuario introduzca dos registros con el mismo campo clave, generndose
por tanto una excepcin. Como podemos capturar dicha excepcin?, dado que el Post lo hace el
correspondiente control de base de datos (DBGrid, etc.) Pues muy fcil, los errores generados a la
hora de hacer el Post en una tabla, son centralizados en el evento OnPostError del propio TTable...
slo tendremos que usarlo.
Por ejemplo, metiendo un cdigo similar a ste:
procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
{Error in the Post}
ShowMessage('Error al dar de alta un nuevo registro'+#13+'Motivo:'+E.Message);
Action:=daAbort;
end;
Con el parmetro Action, podemos especificar que es lo que hay que hacer con el Post que gener
el error. En el ejemplo, utilizamos daAbort para abortar dicho Post.

Capturar errores de edicin - edit - y validacin - post - de una tabla y mostrar


un mensaje personalizado
Ejemplo que muestra cmo capturar errores de Base de Datos Paradox en Delphi, utilizando los
eventos "EditError" y "PostError" del componente TTable:
En el evento "EditError" del TTable de nuestro mdulo de datos digitamos el siguiente cdigo:
Procedure TDatos.TDistribuidorEditError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
Begin
if e is EDBEngineError then
Begin
Case EDBEngineError(E).Errors[0].ErrorCode of
10241: begin
messagedlg ('El registro actual est siendo modificado por el usuario: ' +
UpperCase(copy(e.Message, pos('User:', E.Message) + 6, length(e.Message))) + chr(13) +
chr(13) + ' Espere a que ste termine para modificarlo.', mterror, [mbok] , 0);
end;
8708: begin
messagedlg ('El registro actual ha sido ELIMINADO por otro usuario.' +
Pulse refrescar para actualizar los cambios.', mterror, [mbok], 0);
end;
9727: begin
messagedlg ('Ya existe un producto con este nombre.' +
Cambie el nombre o cancele las modificaciones.', mterror, [mbok], 0);
end;
else
messagedlg ('Se ha producido un error al intentar editar el registro.', mterror, [mbok], 0));
End;
Action: = daAbort;
End;
End;
En el evento "PostError" del TTable colocaremos el siguiente cdigo:
Procedure TDatos.TDistribuidorPostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
Begin
If e is EDBEngineError then
Begin
Case EDBEngineError(E).Errors[0].ErrorCode of
9729: begin
fp.mserror ('Registro existe.' + ' Cancele las modificaciones.', 'Valor duplicado.');
end;
else
fp.mserror ('Error al intentar guardar los datos del registro actual.', 'Error al validar...');
end;
Action := daAbort;
end;
end;

Funciones y procedimientos para fecha y hora


Si hay algo de lo que no podemos escapar los programadores de gestin es el tener que lidiar con
campos de fecha y hora tales como clculo de d as entre fechas, averiguar en que fecha caen los
das festivos, cronometrar el tiempo que tardan nuestras rutinas, etc. Para la mayora de funciones
tenemos que aadir la unidad DateUtils :
uses
Windows, Messages, ..., DateUtils;
Veamos entonces que funciones nos pueden ser tiles para ello:
function DayOfTheMonth( const AValue: TDateTime ): Word;
Esta funcin extrae el nmero de da de una fecha en concreto sin tener que utilizar la funcin
DecodeDate.
var Fecha: TDate;
begin
Fecha := StrToDate( '23/08/2007' );
ShowMessage( IntToStr( DayOfTheMonth( Fecha ) ); // muestra 23
end;
function DayOfTheWeek( const AValue: TDateTime ): Word;
Nos dce en que da de la semana (1-7) cae una fecha en concreto (el primer da es el Lunes, al
contrario de otras funciones de fecha y hora donde el primer da es el Domingo).
Fecha := StrToDate( '5/08/2007' );
ShowMessage( IntToStr( DayOfTheWeek( Fecha ) ) ); // devuelve 7 (Domingo)
Fecha := StrToDate( '10/08/2007' );
ShowMessage( IntToStr( DayOfTheWeek( Fecha ) ) ); // devuelve 5 (Viernes)
Fecha := StrToDate( '23/08/2007' );
ShowMessage( IntToStr( DayOfTheWeek( Fecha ) ) ); // devuelve 4 (Jueves)
function DayOfWeek( Date: TDateTime ): Integer;
Esta funcin es igual a la funcin DayOfTheWeek con la diferencia de que el primer da de la
semena es el domingo.
Fecha := StrToDate( '5/08/2007' );
ShowMessage( IntToStr( DayOfWeek( Fecha ) ) ); // devuelve 1 (Domingo)
Fecha := StrToDate( '10/08/2007' );
ShowMessage( IntToStr( DayOfWeek( Fecha ) ) ); // devuelve 6 (Viernes)
Fecha := StrToDate( '23/08/2007' );
ShowMessage( IntToStr( DayOfWeek( Fecha ) ) ); // devuelve 5 (Jueves)

function DayOfThe Year( const AValue: TDateTime ): Word;


Al pasarle una fecha nos devuelve el nmero de da que corresponde a lo largo del ao.
Fecha := StrToDate( '5/08/2007' );
ShowMessage( IntToStr( DayOfTheYear( Fecha ) ) ); // devuelve 217
Fecha := StrToDate( '10/08/2007' );
ShowMessage( IntToStr( DayOfTheYear( Fecha ) ) ); // devuelve 222
Fecha := StrToDate( '23/08/2007' );
ShowMessage( IntToStr( DayOfTheYear( Fecha ) ) ); // devuelve 235
function DaysBetween( const ANow, AThen: TDateTime ): Integer;
Devuelve el nmero de das que hay entre las fechas ANow y AThen.
var
Fecha1, Fecha2: TDate;
begin
Fecha1 := StrToDate( '10/08/2007' );
Fecha2 := StrToDate( '23/08/2007' );
ShowMessage( IntToStr( DaysBetween( Fecha1, Fecha2 ) ) ) ; // devuelve 13
end;
function DaysInMonth( const AValue: TDateTime ): Word;
Nos dice cuantos das tiene el mes que le pasamos como fecha.
DaysInMonth( StrToDate( '01/01/2007' ) ) devuelve 31
DaysInMonth( StrToDate( '01/02/2007' ) ) devuelve 28
DaysInMonth( StrToDate( '01/04/2007' ) ) devuelve 30
function DaysInYear( const AValue: TDateTime ): Word;
Nos dice el nmero de das que tiene un ao segn la fecha que le pasamos.
DaysInYear( StrToDate( '01/01/2007' ) ) devuelve 365
function DaySpan( const ANow, AThen: TDateTime): Double;
Devuelve el nmero de das de diferencia entre dos fechas y horas incluyendo la parte fraccional.
var
FechaHora1, FechaHora2: TDateTime;
begin
FechaHora1 := StrToDateTime( '10/08/2007 13:00' );
FechaHora2 := StrToDateTime( '23/08/2007 19:00' );

ShowMessage( FloatToStr( DaySpan( FechaHora1, FechaHora2 ) ) ); // devuelve 13,25


end;
procedure DecodeDate( Date: TDateTime; var Year, Month, Day: Word );
Este procedimiento convierte un valor de fecha TDate en valores enteros para el ao, mes y da.
var
wAnyo, wMes, wDia: Word;
begin
DecodeDate( StrToDate( '23/08/2007' ), wAnyo, wMes, wDia );
Memo.Lines.Add( 'Da: ' + IntToStr( wDia ) );
Memo.Lines.Add( 'Mes: ' + IntToStr( wMes ) );
Memo.Lines.Add( 'Ao: ' + IntToStr( wAnyo ) );
end;
procedure DecodeTime( Time: TDateTime; var Hour, Min, Sec, MSec: Word );
Este procedimiento convierte un valor de hora TTime en valores enteros para la hora, minutos,
segundos y milisegundos.
var
wHora, wMinutos, wSegundos, wMilisegundos: Word;
begin
DecodeTime( StrToTime( '14:25:37' ), wHora, wMinutos, wSegundos, wMilisegundos );
Memo.Lines.Add( IntToStr( wHora ) + ' horas' );
Memo.Lines.Add( IntToStr( wMinutos ) + ' minutos' );
Memo.Lines.Add( IntToStr( wSegundos ) + ' segundos' );
Memo.Lines.Add( IntToStr( wMilisegundos ) + ' milisegundos' );
end;
procedure DecodeDateTime( const AValue: TDateTime; out AYear, AMonth, ADay, AHour,
AMinute, ASecond, AMilliSecond: Word );
Este procedimiento decodifica un valor TDateTime en valores enteros para el ao, mes, da, hora,
minutos, segundos y milisegundos.:
var
wAnyo, wMes, wDia: Word;
wHora, wMinutos, wSegundos, wMilisegundos: Word;
begin
DecodeDateTime( StrToDateTime( '24/08/2007 12:34:53' ), wAnyo, wMes, wDia, wHora,
wMinutos, wSegundos, wMilisegundos );
Memo.Lines.Add( 'Da: ' + IntToStr( wDia ) );
Memo.Lines.Add( 'Mes: ' + IntToStr( wMes ) );
Memo.Lines.Add( 'Ao: ' + IntToStr( wAnyo ) );
Memo.Lines.Add( IntToStr( wHora ) + ' horas' );
Memo.Lines.Add( IntToStr( wMinutos ) + ' minutos' );
Memo.Lines.Add( IntToStr( wSegundos ) + ' segundos' );

Memo.Lines.Add( IntToStr( wMilisegundos ) + ' milisegundos' );


end;
function EncodeDate( Year, Month, Day: Word ): TDateTime;
Convierte los valores enteros de ao, mes y da a un valor TDateTime o TDate.
EncodeDate( 2007, 8, 24 ) devuelve 24/08/2007
function EncodeTime( Hour, Min, Sec, MSec: Word ): TDateTime;
Convierte los valores enteros de hora, minutos, segundos y milisegundos en un valor TDateTime o
TTime.
EncodeTime( 12, 34, 47, 0 ) devuelve 12:34:47
function EncodeDateTime( const AYear, AMonth, ADay, AHour, AMinute, ASecond,
AMilliSecond: Word ):TDateTime;
Convierte los valores enteros de ao, mes, da, hora, minutos, segundos y milisegundos en un valor
TDateTime.
EncodeDateTime( 2007, 8, 24, 12, 34, 47, 0 ) devuelve 24/08/2007 12:34:47
function EndOfADay( const AYear, ADayOfYear: Word ): TDateTime; overload;
function EndOfADay( const AYear, AMonth, ADay: Word ): TDateTime; overload;
Devuelve un valor TDateTime que representa la ltima fecha y hora de un da en concreto.
EndOfADay( 2007, 8, 13 ) devuelve 13/08/2007 23:59:59
EndOfADay( 2007, 1, 1 ) devuelve 01/01/2007 23:59:59
EndOfADay( 2007, 2, 1 ) devuelve 01/02/2007 23:59:59
EndOfADay( 2007, 8, 23 ) devuelve 08/23/2007 23:59:59
EndOfADay( 2007, 1 ) devuelve 01/01/2007 23:59:59
EndOfADay( 2007, 32 ) devuelve 01/02/2007 23:59:59
NOTA IMPORTANTE: La funcin con tres parmetros es erronea en la versin de Delphi 7
Build 4.453. Da los siguientes valores:
EndOfADay( 2007, 8, 13 ) devuelve 12/09/2007 23:59:59 (mal)
EndOfADay( 2007, 1, 1 ) devuelve 31/01/2007 23:59:59 (mal)
EndOfADay( 2007, 2, 1 ) devuelve 28/02/2007 23:59:59 (mal)
EndOfADay( 2007, 8, 23 ) devuelve 12/09/2007 23:59:59 (mal)
EndOfADay( 2007, 1 ) devuelve 01/01/2007 23:59:59 (bien)
EndOfADay( 2007, 32 ) devuelve 01/02/2007 23:59:59 (bien)
Con lo cual es recomendable actualizarse a una versin superior (yo me he actualizado a la versin
Delphi 7.0 Build 8.1 y sigue sin hacerme ni puto caso).

function EndOfAMonth( const AYear, AMonth: Word ): TDateTime;


Devuelve un valor TDateTime que representa la ltima fecha y hora de un mes.
EndOfAMonth( 2007, 1 ) devuelve 31/01/2007 23:59:59
EndOfAMonth( 2007, 2 ) devuelve 28/02/2007 23:59:59
EndOfAMonth( 2007, 8 ) devuelve 31/08/2007 23:59:59
function EndOfAWeek( const AYear, AWeekOfYear: Word; const ADayOfWeek: Word = 7
): TDateTime;
Devuelve un valor TDateTime que representa la ltima fecha y hora de una semana. El parmetro
AWeekOfYear representa el nmero de semana a lo largo del ao.
EndOfAWeek( 2007, 1 ) devuelve 07/01/2007 23:59:59
EndOfAWeek( 2007, 2 ) devuelve 14/01/2007 23:59:59
EndOfAWeek( 2007, 3 ) devuelve 21/01/2007 23:59:59
function EndOfAYear( const AYear ): TDateTime;
Devuelve un valor TDateTime que representa la ltima fecha y hora del ao que le pasemos.
EndOfAYear( 2007 ) devuelve 31/12/2007 23:59:59
EndOfAYear( 2008 ) devuelve 31/12/2008 23:59:59
EndOfAYear( 2009 ) devuelve 31/12/2009 23:59:59
function IncDay( const AValue: TDateTime; const ANumberOfDays: Integer = 1 ):
TDateTime;
Devuelve el valor fecha y hora AValue incrementando el nmero de das especificado en
ANumberOfDays (por defecto 1).
IncDay( StrToDate( '24/08/2007' ) ) devuelve 25/08/2007
IncDay( StrToDate( '24/08/2007' ), 10 ) devuelve 03/09/2007
function IncMonth( const Date: TDateTime; NumberOfMonths: Integer = 1 ): TDateTime;
Devuelve el valor fecha y hora AValue incrementando el nmero de meses especificado en
NumberOfMonths (por defecto 1).
IncMonth( StrToDate( '24/08/2007' ) ) devuelve 24/09/2007
IncMonth( StrToDate( '24/08/2007' ), 3 ) devuelve 24/11/2007
procedure IncAMonth( var Year, Month, Day: Word; Numbe rOfMonths: Integer = 1 );
Este procedimiento es similar a la funcin IncMonth pero en vez de pasarle la fecha en formato
TDateTime se le pasa en formato ao, mes y da.
var
wAnyo, wMes, wDia: Word;

begin
wDia := 24;
wMes := 8;
wAnyo := 2007;
IncAMonth( wAnyo, wMes, wDia );
Memo.Lines.Add( 'Da: ' + IntToStr( wDia ) );
Memo.Lines.Add( 'Mes: ' + IntToStr( wMes ) );
Memo.Lines.Add( 'Ao: ' + IntToStr( wAnyo ) );
end;
function IncWeek( const AValue: TDateTime; const ANumbe rOfWeeks: Integer = 1 ):
TDateTime;
Devuelve el valor fecha y hora AValue incrementando el nmero de semanas especificado en
ANumberOfWeeks (por defecto 1).
IncWeek( StrToDate( '24/08/2007' ) ) devuelve 31/08/2007
IncWeek( StrToDate( '24/08/2007' ), 2 ) devuelve 07/09/2007
function IncYear( const AValue: TDateTime; const ANumberOfYears: Integer = 1 ):
TDateTime;
Devuelve el valor fecha y hora AValue incrementando el nmero de aos especificado en
ANumberOfYears (por defecto 1).
IncYear( StrToDate( '24/08/2007' ) ) devuelve 24/08/2008
IncYear( StrToDate( '24/08/2007' ), 2 ) devuelve 24/08/2009

Filtro DBEdit y DBGrid


Es un DBEdit que filtra un DBGrid y que este a la vez filtra otro, me explico,
DBGrid1 OT, DBGrid2 Productos, DBEdit1 muestra el Numero de OT Del DBGrid1
y Filtra los Productos en el DBGrid2, el problema es cuando no hay OT's
pendientes en productos me muestra todos los que hay en la base de datos y
necesito quede en blanco cuando no hay con que filtrar el DBGrid2.
Suponiendo Table1 y TWOT abiertas y DBEdit1 con su DataSource apuntando al
campo de la tabla1, Pon esto en el OnChange del DBEdit
(* aplicar filtro sobre tabla TWOT *)
procedure TForm1.DBEdit1Change(Sender: TObject);
begin
TWOT.Filtered:= False;
TWOT.Filter:='OT ='+ QuotedStr(DBEdit1.Text);
TWOT.Filtered:= True;
end;

Bsqueda Incremental
Estoy haciendo una aplicacin y quiero que tenga Edit que sirva para buscar y
filtrar solamente el registro deseado.
procedure TFormPrincipal.Edit1Change(Sender: TObject);
begin
ClienDataSet1.Encomiendas_vista2.Filtered := False;
ClienDataSet1.Encomiendas_vista2.Filter := 'UPPER(Nombre) Like ' +
QuotedStr(UpperCase(Edit1.Text)+'%');
ClienDataSet1.Encomiendas_vista2.Filtered:= True;
end;

Bsqueda Incremental con Query


procedure TForm1.Edit1Change(Sender: TObject);
begin
with Query1 do
begin
Close;
SQL.Text:= 'SELECT * FROM ZTABLE3'+
' WHERE CODIGO >= ' + QuotedStr(ComboBox1.Text)+
' AND CODIGO <= ' + QuotedStr(Edit1.Text);
Open;
end
end;

Bsqueda incremental con ComboBox


procedure TProductos.Edit1Change(Sender: TObject);
Var
Valor, Valor1: String;
begin
if Edit1.text = '' then
begin
BDatos.ZTable3.Filtered := false;
exit;
end;
BDatos.ZTable3.Locate(ComboBox1.Text,
Edit1.Text,[loPartialKey,loCaseInsensitive]);
valor := Edit1.Text;
Valor1 := Valor;
inc(valor1[length(Valor1)]);
BDatos.ZTable3.Filter := ''+ComboBox1.Text+' >= '+QuotedStr(Valor)+ ' and
'+ComboBox1.Text+' < ' +QuotedStr(valor1);
BDatos.ZTable3.Filtered := true;
end;
end.

Tambin en el OnChange del ComboBox inclu esto:


procedure TProductos.ComboBox1Change(Sender: TObject);
begin
Edit1.Clear;
end;

Con esto nos aseguramos hacer una bsqueda en blanco por cada criterio
elegido.
Consulta 1 Edit a 2 Columnas de una Tabla
Tengo una Tabla que entre varias columnas existen "Nombre" y "Apellido
Paterno", hasta ahora tengo la consulta para buscar o por nombre o por apellido y
funciona perfecto, la duda: existe la forma de poder "Filtrar" las 2 columnas segn
el criterio de 1 "Edit"???, en este caso algo as:
Nombre - Apellido
Juan - Tapia
Mara - Mora
Jos - Salas
La idea es que al escribir "1" queden en este caso filtrados la fila 1 y 2, ya que 1
tiene "1" en el apellido y 2 en el nombre.

procedure TClientes.Edit2Change(Sender: TObject);


const
// suponiendo que esta sea tu consulta
STRSQL = 'Select * from CONTACTOCLIENTE ';
STRORDER = ' ORDER BY NOMBRES';
begin
BDatos.QContactoCliente.Close;
// Est vaco
if (Edit2.Text = '') then begin
BDatos.QContactoCliente.SQL.Text := STRSQL;
end
else begin
// montamos la sql
BDatos.QContactoCliente.SQL.Text := STRSQL +
// Aadimos el WHER
' WHERE Upper(NOMBRES) LIKE Upper(' + QuotedStr('%' + Edit2.Text + '%') + ')' +
'or Upper(APELLIDO) LIKE Upper(' + QuotedStr('%' + Edit2.Text + '%') + ')' +
STRORDER;
end;
BDatos.QContactoCliente.Open;
end;

Buscar Registros en Firebird


Tengo una base de datos en Firebird e IbExpert llamada bdusuarios y tengo una
tabla llamada usuarios con tres atributos clave, nombre, domicilio; tambin tengo
un Form con sus respectivos Edit.
Quisiera saber cmo es el cdigo para que me busque un registro dando la clave
en un Edit y pulsando un botn para que me muestre el nombre y el domicilio del
usuario en los dems Edit.
procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.sql.text:= 'Select Clave,nombre,domicilio from Usuarios where Clave = :Cla';
Query1.Parameters[0].Value := Edit1.Text;
Query1.Open;
if not Query1.IsEmpty then
begin
Edit2.text:= Query1.filebyname('nombre').AsString;
Edit3.text:= Query1.filebyname('domicilio').AsString
end
else
begin
MessageDlg('Clave Invlida',mtError, [mbOK], 0);
Edit1.Text := '';
Edit1.SetFocus
end;
Query1.Active := False;
end;

Cmo verificamos si una tabla o un Query tiene registros


if ibquery1.IsEmpty then //pregunta si el Query est vaco
begin
Application.MessageBox( No existe listado para la nmina ingresada, Lista vaca);
end;

Utilizando el IBQuery para traer datos de ms de una tabla


Crear la conexin con la base de datos utilizando los componentes IBDatabase e
IBTransaction.
Agregar un IBQuery al formulario y relacionar con el IBDatabase.
Modificar las siguientes propiedades del IBQuery:
Database: colocar el nombre del componente IBDatabase.
SQL: debemos crear la consulta SQL. Este es un ejemplo si usamos las tablas de
la figura anterior:
SELECT trabajadores.trabajador, trabajadores.apellido, trabajadores.nombre,
nominas.horas_normales, nominas.horas_extras, nominas.mes, nominas.ano
FROM nominas, trabajadores
WHERE nominas.trabajador=trabajadores.trabajador

Y para terminar agregamos un DataSource y relacionar el DataSource con el


IBQuery.
Editando los valores del IBQuery en tiempo de ejecucin para realizar
bsquedas filtradas.
Crear la conexin con la base de datos utilizando los componentes IBDatabase e
IBTransaction.
Agregar un IBQuery al formulario y relacionar con el IBDatabase.
Modificar las siguientes propiedades del IBQuery. Ver punto anterior Utilizando el
IBQuery para traer datos de ms de una tabla.
Agregar un DBGrid, un Edit y un botn al formulario.
Relacionar el DBGrid con el DataSource del IBQuery.
Y en el botn, en el evento clic, hacemos lo siguiente (por cdigo).
Desactivamos el IBQuery para poder cambiar los datos: IBQuery1.active:=false;
Cambiamos el texto de la propiedad SQL del IBQuery:
ibquery1.SQL.Text:=SELECT trabajadores.trabajador, trabajadores.apellido,
trabajadores.nombre, nominas.horas_normales, nominas.horas_extras, nominas.mes,
nominas.ano
FROM nminas, trabajadores
WHERE nominas.trabajador=trabajadores.trabajador and nominas.nomina=+edit1.Text;

Activamos el IBQuery.

Seleccionar varios registros de una tabla por un campo


Queremos mostrar todos los registros de una tabla cuyo campo N.I.F. sea el
mismo.
Query1.Close;
Query1.Sql.Clear;
Query1.Sql.Add('Select * From MiTabla ');
Query1.Sql.Add('Where NIF = '+QuotedStr(Edit1.Text));//En Edit1 se supone est el Nif.
Query1.Open;

Con un Filtro
MiTabla.Filter:='NIF ='+QuotedStr(Edit1.Text);
MiTabla.Filtered:=True;

Realizar bsqueda en Firebird


Tengo una tabla en Firebird 2.5, y quiero realizar dos tipos de bsqueda: El
primero por el cdigo (campo clave) y el segundo es por nombre de producto.
Un ejemplo con TIBDataSet:
procedure TForm1.Edit1Change(Sender: TObject);
begin
IBDataSet1.Close;
IBDataSet1.SelectSQL.Text:= 'SELECT * FROM PRODUCTOS WHERE NOMBRE LIKE
:BUSCADO';
IBDataSet1.ParamByName('BUSCADO').AsString:= Edit1.Text+'%';
IBDataSet1.Open;
end;

Toma en cuenta que en este caso la cadena SQL que originalmente le asignaste a
la propiedad SelectSQL es reemplazada por cada nueva asignacin.
Datos del PC: Nombre, IP y usuario
Siempre es muy til poder disponer de los datos relativos a la red del equipo en el
que estamos ejecutando nuestra aplicacin. He englobado los principales datos en
una nica funcin para simplificar el proceso y as obtener:
- Nombre del PC
- Direccin IP local
- Nombre del usuario de Windows.
Recordad aadir al uses lo siguiente: WinInet, WinSock;

Para simplificar los parmetros he creado un tipo de datos que debis poner
despus del uses
type TDatosPC = record
Nombre, IP, Usuario :String;
end;

Y esta es la funcin que nos devuelve los tres datos


procedure ObtenerDatosPC (var Datos:TDatosPC );
const LARGO_MAXIMO = 50;
var buffer:Array [0..LARGO_MAXIMO+1] of char;
Largo:Cardinal;
PuntHost: PHostEnt;
PuntIP: PAnsichar;
wVersionRequested: WORD;
wsaData: TWSAData;
begin
Largo := LARGO_MAXIMO +1;
Datos.Nombre := '';
If GetComputerName (buffer, Largo) then
Datos.Nombre := buffer;
Datos.Usuario := '';
if GetUserName(buffer, largo) then
Datos.Usuario := buffer;
wVersionRequested := MAKEWORD( 1, 1 );
WSAStartup( wVersionRequested, wsaData );
GetHostName( @buffer, LARGO_MAXIMO );
PuntHost := GetHostByName( @buffer );
PuntIP := iNet_ntoa( PInAddr( PuntHost^.h_addr_list^ )^ );
Datos.IP := PuntIP ;
WSACleanup;
end;

Meter los valores de una columna en un ComboBox


Tengo unas tablas que estoy utilizando, todo va muy bien, hasta
meter los valores de una columna en un ComboBox, por ejemplo
tengo 2 columnas en una tabla, la columna 1 se llama idusuario y la
llama promedio, por ejemplo digamos que este es el contenido
idpaciente
1
1
2
3
2
1

promedio
3.2
4.4
5.2
1.5
3.5
2.9

que necesito
digamos que
columna 2 se
de mi tabla:

Y lo que yo necesito es que en el ComboBox aparezca por ejemplo en cada


rengln los resultados que en este caso seran el 3.2, 4.4 y 2.9, el problema es
que solo me aparece el primer resultado que es el 3.2.
Adele un while, ejemplo:
query.Close;
query.SQL.Clear;
query.SQL.Add('select * from citas where idpaciente=1');
query.Open;
while not query.eof do
begin
combobox2.Items.Add(query.FieldValues['promedio']);
query.next;
end;

Pasar de una tabla1 a una tabla2 la misma informacin


Tengo una tabla1 que tiene campos campo1, campo2
Tengo otra tabla que tienen campos campo1, campo2, campo3
Como se hace para pasar toda la informacin de la tabla 1 a la tabla2.
procedure TForm1.Button1Click(Sender: TObject);
begin
with TuDataset do begin
SQL.Clear;
SQL.Add('insert into tabla2(campo1, campo2)');
SQL.Add('select campo1, campo2 from tabla1');
ExecSQL;
end; //Fin with
end;

Llenar un ComboBox con los campos de una tabla


Quiero llenar un ComboBox con los campos de una tabla no los datos sino los
campos, me explico: tabla clientes: NOMCLI, DIRCLI, TELCLI, CC. En el
ComboBox:
Nombre->valor(NOMCLI)
Direccin->valor(DIRCLI)
Eso es para fines de bsqueda de datos como un filtro algo as.
var q:Tquery;
i:integer;
begin
q := Tquery.create(nil);
q.databasename := 'c:\......';

q.sql.text := select * from tabla;


q.FieldsDef.Update;
with q do
for i:=0 to FieldsDef.Count-1 do
combo.items.Add(Fieldsdef[i].FieldName);
freeandnil(q);
end;

Cmo obligo el ingreso de datos a todos los DBEdit de un formulario


procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
errors: string;
const
MSG_SEPARATOR = #13#13;
EMPTY_EDIT_MSG = '%s edit is empty';
begin
errors := '';
for i := 0 to EditsPanel.ControlCount - 1 do
begin
if (EditsPanel.Controls[i] is TEdit) then
begin
if (Trim(TEdit(EditsPanel.Controls[i]).Text) = EmptyStr) then
begin
if (errors = EmptyStr) then begin
errors := Format(EMPTY_EDIT_MSG,
[TEdit(EditsPanel.Controls[i]).Name]);
end else begin
errors := errors + MSG_SEPARATOR + Format(
EMPTY_EDIT_MSG, [TEdit(EditsPanel.Controls[i]).Name]);
end;
end;
end;
end;
if (errors <> EmptyStr) then begin
ShowMessage(errors);
end else begin
ShowMessage('All edits contain values');
end;
end;

Copiar datos de una tabla a una Edit


Debes tomar el valor de tu DataSet (que puede ser un Table, Query...) que se
enlaza a tu DBGrid.
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
FormB.Edit1.Text := DataSet.FieldByName('ID_Cliente').AsString;

FormB.Edit2.Text := DataSet.FieldByName('NombCliente').AsString;
FormSig.ShowModal;
end;

Asignarle el Valor de un DBEdit a un DBGrid


El DBEdit me captura un valor ejemplo el 4500, quiero que ese valor se coloque
automticamente en uno de mis campos del DBGrid el cual se llama Valor.
Usa el dataset asociado al dbgrid:
Table1.FieldByName('Valor').AsString := Edit1.Text;

Realmente como era un DBEdit le hice esta instruccin:


IBDataSet.FieldByName('Valor').AsString:=DBEdit.Field.AsString

Buscar en un campo de una tabla por Caracteres


Que tengo que hacer para buscar por caracteres en un campo alfanumrico de
una tabla. Por ejemplo tengo campo que se llama nombre y quiero que al ingresar
una letra me devuelva todos los nombres que empiezan con esa letra.
En el evento OnChange de tu Edit, haces una consulta o un filtro sobre tu DataSet.
Query.Close;
Query.Sql.Text := 'Select * From Tabla Where nombre like '+QuotedStr(Edit1.Text+'%');
Query.Open;

O si es una Table
Table.Filtered := False;
Table.Filter := 'nombre like '+QuotedStr(Edit1.Text+'%');
Table.Filtered := True;

Buscar registros semejantes


Tengo una pequea base de datos, con los campos, NOMBRE1, NOMBRE2,
APELLIDO1, APELLIDO2, NOMCOMERCIAL.
El usuario ya ha seleccionado por cul de los campos desea buscar, mi problema
aparece es cuando deseamos buscar por uno de los campos por ejemplo la
palabra 'ALBERTO', pero el usuario solo escribe 'ALBE', y deberan salir en mi
DBGrid, todos los registros que el campo NOMBRE1, inicien con 'ALBE', hay
algn comodn para usarlo, o alguna instruccin., y me lo envi a un DBGrid.
Estoy usando Firebird y controles IBX

Enlazas al IBQuery aun componente DataSource (Propiedad DataSet colocas en


nombre del IBQuery) y a este con el DBGrid en su propiedad DataSource.
Quedara algo as:
IBuscar.SQL.Add('SELECT IDENTIFICADOR, NOMBRE1, NOMBRE2, APELLIDO1,
APELLIDO2, NOMCOMERCIAL FROM NOMBRE WHERE NOMBRE1 starting with
:NOMBRE ORDER BY NOMBRE2');
IBuscar.ParamByName('NOMBRE').Value := 'J'

Datos Numeric y DBGrid, no muestra decimales


Estoy trabajando con una base de datos Firebird en donde tengo una tabla
Prestamos, los campos que debo manejar, entre otros, son uno de moneda y otro
de porcentaje, los cuales me sirven para poner valores del tipo Numeric (10,2) y
(4,2) respectivamente, ya que uno representa un valor monetario y el otro un
porcentaje que bien podra ser 40.00 o 55.50.
Lo que me pasa es que estos valores ya estn cargados en la base de datos,
estoy haciendo unas migraciones y estn cargados en un Form, tengo un DBGrid
en donde formateo uno por uno los campos a mostrar y NO logro que aparezcan
los decimales de monto o porcentaje en las columnas de estos valores. Por
ejemplo:
- Tabla Prstamo (Nro./Monto/Porcentaje)
1 / 1500.50 / 25.66

- DBGrid de Prestamos
1 / 1500.00 / 25.00

He formateado estos campos con los siguiente DisplayFormat:


Monto, #0.00 (separa miles y decimales) y Porcentaje #0.00
Pero es como si no tuvieran decimales, si hago una suma es tal cual los muestra,
solo la parte entera.
Cambia el punto por la coma en el DisplayFormat y funcionara correctamente:
TFloatField(IBQuery1.FieldByName('TU_CAMPO')).DisplayFormat := '0.00';

Copiar el valor de cada campo en un ComboBox


Tengo una base de datos Materias con el ndice Saln, con los campos: Saln *,
Materia1, Materia2, Materia3, Materia4, Materia5;
Lo que necesito es copiar el valor de cada campo en un ComboBox.
Yo usara el evento AfterScroll del DataSet que tengas asociado a tu tabla, y ah
aadira uno a uno los campos:

ComboBox1.Items.Clear;
ComboBox1.Items.Add(DataSet['Salon']);
ComboBox1.Items.Add(DataSet['Materia1']);
ComboBox1.Items.Add(DataSet['Materia2']);

De acuerdo a lo que entiendo de tus mensajes, sera:


procedure TForm1.FormCreate(Sender: TObject);
const
SEP = ', ';
var
i: Integer;
s: string;
begin
DataSet.Open;
ComboBox1.Items.Clear;
while not DataSet.Eof do
begin
s:= '';
for i:= 0 to DataSet.FieldCount-1 do
s:= s + DataSet.Fields[i].AsString + SEP;
SetLength(s,Length(s)-Length(SEP));
DataSet.Next;
ComboBox1.Items.Add(s);
end;
ComboBox1.ItemIndex:= 0;
end;
procedure TForm1.DBGrid1CellClick(Column: TColumn);
const
SEP = ', ';
var
i: Integer;
s: string;
begin
s:='';
for i:= 0 to DataSet.FieldCount-1 do
s:= s + DataSet.Fields[i].AsString + SEP;
SetLength(s,Length(s)-Length(SEP));
ComboBox1.ItemIndex:= ComboBox1.Items.IndexOf(s);
end;

Consulta con 3 tablas


Quiero que por favor me expliquen esto: Poseo 3 tablas en Firebird y Delphi 2007
Alumnos
cod_alumno *
cod_curso
nombre

Salones
cod_curso *
materia1
ihs1

Calificaciones
cod_curso *
cod_alumno *
ao *

apellidos
ao

docente1

materia1
docente1
nota1p_mat1
logro1p_mat1
ausencia1_mat1

Deseo una consulta, en un DBGrid que muestre esto:


curso

ao

cod_alumno

nombres

apellidos

materia1

docente1

nota1

logro1

Logro2

Logro3

En una base de datos (bien hecha) las tablas estn unidas gracias a sus llaves
primarias y forneas. Se navega desde una tabla A, tabla B y luego a la tabla C:
SELECT A.cod_alumno,S.cod_curso,A.nombre, (y todo lo dems)
FROM Alumnos A,Salones S, Calificaciones C
WHERE A.cod_alumno=C.cod_alumno AND C.cod_curso=S.cod_curso

Grabar imgenes en campo Blob de Firebird


El cdigo que publico, almacena los tipos de grficos en un campo blob
procedure TF_Cliente.BitBtn1Click(Sender: TObject);
var
BitmapOriginal,BitmapNew: TBitmap;
FileExt: string;
Graphic: TGraphic;
stream: TMemoryStream;
begin
inherited;
// Verifica que la tabla este en modo de edicin o de insercin segn sea el caso
if datos.cdsFoto_cte.IsEmpty then
datos.cdsFoto_cte.Append
else
datos.cdsFoto_cte.Edit;
// Inicio del cdigo que almacena la imagen en memoria (en la variable stream)
BitmapNew:= TBitmap.Create;
BitmapOriginal := TBitmap.Create;
stream:= TMemoryStream.Create;
try
OpenPictureDialog1.Execute;
FileExt := LowerCase(ExtractFileExt(OpenPictureDialog1.FileName));
if (FileExt = '.bmp') then
Graphic:= TBitmap.Create;
if (FileExt = '.ico') then
Graphic:= TIcon.Create;
if (FileExt = '.emf') or (FileExt = '.wmf') then
Graphic:= TMetafile.Create;
if (FileExt = '.jpg') or (FileExt = '.jpeg') or (FileExt = '.jpe') then
Graphic:= TJPEGImage.Create;

ausencia

if (FileExt = '.png') then


Graphic:= TPngImage.Create;
if (FileExt = '.gif') then
Graphic:= TGIFImage.Create;
Graphic.LoadFromFile(OpenPictureDialog1.FileName);
BitmapOriginal.Assign(Graphic);
try
BitmapNew.Width:= 192;
BitmapNew.Height:= 182;
BitmapNew.PixelFormat:= pf24bit;
//cambia el mapa de bits (la foto) original para el nuevo tamao 192x182
BitmapNew.Canvas.StretchDraw(BitmapNew.Canvas.ClipRect,BitmapOriginal);
{Si deseas mostrar en un timage
image1.picture.graphic:= BitmapNew;
O si deseas grabar en un archivo
bitmapNew.Savetofile('c:\mi_bmp.bmp')
}
BitmapNew.SaveToStream(stream);
finally
FreeAndNil(BitmapNew);
end;
finally
FreeAndNil(BitmapOriginal);
end;
// Almacena la foto en el campo blob
datos.cdsFoto_cteFOTO_CTE.LoadFromStream(stream);
datos.cdsFoto_cte.Post;
FreeAndNil(stream);
end;

No olvidar de colocar en la clusula USES: pngimage, jpeg, GIFImg; El Form debe


tener 1 OpenPictureDialog1, y para que quede ms claro, esta instruccin:
datos.cdsFoto_cteFOTO_CTE.LoadFromStream(stream);

datos = data module


cdsFoto_cte = Clientdataset
FOTO_CTE = nombre del campo blob;
Imgenes en Firebird
Para cargar la Imagen (BMP, JPG, ICO) con el dilogo directamente a la base de
datos:
procedure TForm1.ButtonCargarImagenClick(Sender: TObject);
var
Jpg: TJpegImage;
Stream: TMemoryStream;
FileExt: string;
GraphType: TGraphType;

begin
if OpenPictureDialog.Execute then
begin
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
FileExt := LowerCase(ExtractFileExt(OpenPictureDialog.FileName));
if (FileExt = '.bmp') or (FileExt = '.dib') then
begin
GraphType := gtBitmap;
Stream.Write(GraphType, 1);
with ImageFoto.Picture.Bitmap do
begin
LoadFromFile(OpenPictureDialog.FileName);
ImageFoto.Picture.Bitmap.SaveToStream(Stream);
end;
end
else if (FileExt = '.ico') then
begin
GraphType := gtIcon;
Stream.Write(GraphType, 1);
with ImageFoto.Picture.Icon do
begin
LoadFromFile(OpenPictureDialog.FileName);
ImageFoto.Picture.Bitmap.SaveToStream(Stream);
end;
end
else if (FileExt = '.emf') or (FileExt = '.wmf') then
begin
GraphType := gtMetafile;
Stream.Write(GraphType, 1);
with ImageFoto.Picture.Metafile do
begin
LoadFromFile(OpenPictureDialog.FileName);
ImageFoto.Picture.Bitmap.SaveToStream(Stream);
end;
end
else if (FileExt = '.jpg') or (FileExt = '.jpeg') or (FileExt = '.jpe') then
begin
Jpg := TJpegImage.Create;
Jpg.LoadFromFile(OpenPictureDialog.FileName);
ImageFoto.Picture.Assign(Jpg);
GraphType := gtJpeg;
Stream.Write(GraphType, 1);
Jpg.SaveToStream(Stream);
end;
DataModule1.IBTPersonas.Edit;
Stream.Position := 0;
DataModule1.IBTPersonasFoto.LoadFromStream(Stream);
except

jpg.Free;
Stream.Free;
raise;
end;
jpg.Free;
Stream.Free;
end;
end;

Para Mostrar la Foto almacenada en la base de datos en el TImage:


procedure TForm1.MostrarImagenClick(Sender: TObject);
var
Stream: TMemoryStream;
Jpg: TJpegImage;
GraphType: TGraphType;
begin
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
DataModule1.IBTPersonasFoto.SaveToStream(Stream);
if Stream.Size > 0 then
begin
Stream.Position := 0;
Stream.Read(GraphType, 1);
case GraphType of
gtBitmap: Form1.ImageFoto.Picture.Bitmap.LoadFromStream(Stream);
gtIcon:
Form1.ImageFoto.Picture.Icon.LoadFromStream(Stream);
gtMetafile: Form1.ImageFoto.Picture.Metafile.LoadFromStream(Stream);
gtJpeg: begin
Jpg := TJpegImage.Create;
Jpg.LoadFromStream(Stream);
Form1.ImageFoto.Picture.Assign(Jpg);
end
else Form1.ImageFoto.Picture.Assign(nil); // Limpiar la imagen
end;
end
else Form1.ImageFoto.Picture.Assign(nil);
except
Form1.ImageFoto.Picture.Assign(nil);
end;
jpg.Free;
Stream.Free;
end;

Para Borrar la imagen de la base de datos:


procedure TForm1.BorrarImagenClick(Sender: TObject);
begin
ImageFoto.Picture.Assign(nil);
DataModule1.IBTPersonas.Edit;
DataModule1.IBTPersonasFoto.Assign(nil); // Limpiar el campo
end;

Actualizar desde 2 tablas


Quiero actualizar tres campos de una tabla con el contenido de otros tres campos
de otra tabla, mediante un update Cmo lo hago?
Tabla 1 - Tabla 2
Campo1 - Campo 1
Campo2 - Campo 2
Campo3 - Campo
Es decir, el valor de los campos de la tabla 2 pasarlos a los campos de la tabla 1
los campos son del mismo tipo.
UPDATE Tabla1
SET = (SELECT campo1 FROM tabla2 WHERE campo1 = condicion)
WHERE campo = condicin

Actualizar con una condicin


Deseo actualizar el campo de una tabla1, esta se encuentra relacionada con
tabla2 y requiero validar un campo de la tabla2 antes de actualizar, si el campo de
la tabla2 es AH, entonces actualiza la tabla1 colocando la palabra "Herramienta"
UPDATE inve_clib01
SET camplib2 = 'Herramienta'
WHERE cve_prod IN
(SELECT cve_art FROM inve01 WHERE lin_prod = 'AH')

Extraer fecha y desglosar de un campo


Necesito saber si se puede y como, el sacar la fecha de nacimiento de una cadena
que tiene el siguiente formato: ESP19630225, es un cdigo UCI (de los ciclistas).
Lo que necesito es primero extraer las tres letras de la izquierda, y lo siguiente es
poder convertir 19630225 en un campo fecha con formato 25/02/1963, todo desde
una SQL que me actualice el campo fecha nacimiento de mi tabla.
UPDATE ctr0003 SET
nacio = (SUBSTRING(codiuci FROM 1 FOR 3)),
data_naix = CAST( (SUBSTRING(codiuci FROM 4 FOR
4)||'/'||SUBSTRING(codiuci FROM 8 FOR 2)||'/'||SUBSTRING(codiuci FROM 10
FOR 2)) AS DATE);

Como obtener el valor de un campo


Estoy haciendo una consulta con un IBQuery que va as:
SELECT login,
login=:log

clave,

id_perfil

FROM

usuarios

WHERE

clave=:

cla

AND

Extraer el valor de campo id_perfil para el registro obtenido y guardarlo en una


variable (perf = string), pero no s qu instruccin debo colocar para guardar el
valor del campo id_perfil en la variable perf.
var
perf: String;
begin
with IBQUsuarios do
begin
ParamByName('usu').AsString:= txtUsuario.Text;
ParamByName('cla').AsString:= txtClave.Text;
Active := true;
perf:=FieldByName('id_perfil').AsString;
end;

Otra forma posible sera


var
perf: String;
begin
with IBQUsuarios do
begin
ParamByName('USU').AsString:= txtUsuario.Text;
ParamByName('CLA').AsString:= txtClave.Text;
Active := true;
perf:=Fields[2].Value;// Considerando que login=0,clave=1,id_perfil=2; end;

Asignar valor a un campo en una base de datos


Como puedo asignarle un valor a un campo en tiempo de ejecucin sin utilizar
ningn componente. Tienes que poner el DataSet en modo Edicin.
AdoTable.Insert;
AdoTable.FieldByName('Nombre').AsString := 'Luis';
AdoTable.FieldByName('Folio').AsInteger := 1234;
AdoTable.FieldByName('Fecha').AsDateTime := Now;
AdoTable.Post;

Campo clave y campo valor en un ComboBox


Necesito traer desde una Tabla (Firebird 2.1) dos campos: cod_cliente,
nombre_cliente. Una lista con un SELECT.
Quiero poner nombre_cliente en un TComboBox para que se le despliegue al
usuario pero, al momento de guardar en la BD, uso solamente cod_cliente. La
cosa es as, en un ComboBox no puedo traer ambos valores, mostrar uno y
guardarme el otro para usarlo cuando quiera. En un TDBComboBox si es posible
(KeyValue, KeyField, KeyValue)
Ahora bien; si NO quisiera usar TDBComboBox, qu otra opcin tengo? Hay
algn componente que me permita guardar la estructura (clave, valor) y poder
hacer lo que comento (exceptuando el TDBComboBox claro)?. No es complicado
hacer lo que quieres usando un TComboBox:
procedure TForm1.FormCreate(Sender: TObject);
begin
while not IBQuery.Eof do
begin
ComboBox1.AddItem(IBQuery.FieldByName('NOMBRE_CLIENTE').AsString,
TObject(IBQuery.FieldByName('COD_CLIENTE').AsInteger));
IBQuery.Next;
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
with ComboBox1 do
ShowMessage(Format('%s %d',[Items[ItemIndex], // NOMBRE_CLIENTE
Integer(Items.Objects[ItemIndex])]));
// COD_CLIENTE
end;

Query con 2 o ms tablas


Debo hacer un Query en una base de datos Firebird, obviamente, que tome
valores de 2 o 3 tablas. Esto es posible?
Ejemplo: tablas caja, clientes, cobradores. Debo mostrar en un DBGrid, que
tomar los datos de la consulta, los registros de caja, pero en vez de los cdigos

de cliente y cobrador debe mostrar sus nombres, para eso deber tomar el cdigo
de caja y localizar en las otras 2 tablas sus nombres.
SELECT
a.idcaja, b.cliente, c.colaborador
FROM cajas AS a
INNER JOIN clientes AS b
ON b.idcliente = a.clienteid
INNER JOIN colaboradores AS c
ON c.idcolaborador = a.colaboradorid

Query relaciona 3 tablas


Utilizo Firebird 2.5, tengo 3 tablas Facturas, rendicion_detalle y rendicin. Estn
relacionadas facturas.id_factura = rendicion_detalle.id_factura y rendicion.nren =
rendicion_detalle.nren.
Necesito un Query que me entregue todas las facturas tal que no existe en otro
detalle de rendicin (o que exista pero el estado de la rendicin sea NULL), esto
con el afn de no repetir facturar en distintas rendiciones.
SELECT f.* FROM facturas f
WHERE f.id_factura NOT IN (SELECT rendicion_detalle.id_factura
FROM rendicion_detalle)
OR f.id_factura IN(SELECT rendicion_detalle.id_factura FROM
rendicion_detalle,rendicion WHERE endicion.nren=rendicion_detalle.nren
AND rendicion.estado IS NULL)

UPDATE con tablas relacionadas


Tengo 2 tablas en una base Firebird, la tabla Artculos y la tabla tems.
La tabla Artculos utiliza el campo Articulos.FK_Items para relacionarse con la
tabla tems a travs de Items.ID, La relacin entre Artculos e tems es 1 a 1.
Necesito actualizar un campo de la tabla Artculos colocando un valor fijo para el
caso en que el campo cdigo de la tabla tems tenga un determinado valor.
UPDATE articulos
SET codigo_segundo = 'X'
WHERE (SELECT codigo FROM items
WHERE articulos.fk_items = items.id) IN ('AL494J', 'F494P')

UPDATE sobre fechas pero solo las vacas


Tengo una Base Firebird que contiene una tabla de tareas asignadas. Los campos
de esta tabla son: Id, IdInt, FechaAlta, FechaBaja, TareaAsignada, MotivoBaja,
ResposableBaja.
Lo que trato de lograr es que cuando un interno (IdInt) sea dado de baja por algn
motivo me coloque esta fecha solo en las tareas que no han sido dadas de baja.
Por ejemplo

Id
1
2
3
4
5

Idint
1
1
2
2
2

FechaBaja
01/08/2013
30/07/2013
25/05/2013

Como se puede observar en caso de hacer algn


movimiento (Egresa) con el interno 2 (IdInt) necesitara que
en el ID 4 el campo FechaBaja registre la novedad pero
que deje intactas la dems fechas. Creo que buscas algo
como:

UPDATE Tareas SET FechaBaja = :Baja


WHERE idInt = :Indice AND FechaBaja IS NULL

UPDATE de un campo dependiendo del valor de un campo de otra tabla


Tengo dos tablas Tabla1 y Tabla2 y necesito poner, mediante un UPDATE, el
Campo1 de la Tabla1 = True si Campo2 de Tabla2 > 10 y False en caso contrario,
es decir:
Si Campo2 (Tabla2) > 10 -> Campo1 (Tabla1) = True Else Campo1 (Tabla1) =
False. Yo con Firebird uso algo as:
UPDATE Tabla1 T1 SET campo1=TRUE
WHERE EXISTS (SELECT * FROM Tabla2 T2
WHERE T2.campo2>10 AND T2.codigo=T1.codigo)

Suponiendo que todas son FALSE antes de UPDATE.


UPDATE Tabla1 T1 SET
campo1= MI_COMPARACION(T1.campo1, (SELECT T2.campo2 FROM Tabla2 T2
WHERE T1.codigo=T2.codigo),10)

En ambas asumo que el campo cdigo es el que relaciona ambas tablas. En la


segunda propuesta habra que hacer la funcin MI_COMPARACION porque
probar a poner " campo1 = (10 <> SELECT T2.campo2 FROM Tabla2 T2
WHERE T1.codigo=T2.codigo) " y da error, lo que no s es si existe ya alguna
funcin tal efecto (y que devuelva el tipo de dato que te interesa)
Campo clave y campo valor en un ComboBox
Necesito traer desde una Tabla (Firebird 2.1) dos campos: cod_cliente,
nombre_cliente. Una lista con un Select.
Quiero poner nombre_cliente en un ComboBox para que se le despliegue al
usuario pero, al momento de guardar en la BD, uso solamente cod_cliente.
La cosa es as, en un TComboBox no puedo traer ambos valores, mostrar uno y
guardarme el otro para usarlo cuando quiera. En un TDBComboBox si es posible
(keyValue, KeyField, KeyValue)
Ahora bien; si NO quisiera usar TDBComboBox, qu otra opcin tengo? Hay
algn componente que me permita guardar la estructura (clave, valor) y poder

hacer lo que comento (exceptuando el TDBComboBox claro)?. No es complicado


hacer lo que quieres usando un TComboBox:
procedure TForm1.FormCreate(Sender: TObject);
begin
while not IBQuery.Eof do
begin
ComboBox1.AddItem(IBQuery.FieldByName('NOMBRE_CLIENTE').AsString,
TObject(IBQuery.FieldByName('COD_CLIENTE').AsInteger));
IBQuery.Next;
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
with ComboBox1 do
ShowMessage(Format('%s %d',[Items[ItemIndex],// NOMBRE_CLIENTE
Integer(Items.Objects[ItemIndex])]));
// COD_CLIENTE
end;

Consulta necesaria
Yo tengo una tabla cargada con varios datos, supongamos movimientos de un
expediente, dentro de los datos importantes en cada registro est el No. de
expediente (o cdigo nico) y el orden en que se realiz el paso.
No.
1001
1001
1001
1002
1002
1005
1005
1005
1005

Orden
1
2
3
1
2
1
2
3
4

Lo que necesito es hacer una consulta que tome todos los


expedientes cargados, pero solo el ltimo movimiento de cada
uno! el cual est determinado por el orden y as conseguir un
Query con esos datos. Expediente y ltimo Movimiento.
Lo que buscas es esto:

SELECT n_exp,asunto,fecha,folios, MAX(ord) AS ord FROM temp T1


WHERE ord = (SELECT MAX(ord) FROM temp T2
WHERE T2.n_exp = T1.n_exp)GROUP BY n_exp, asunto, fecha, folios

Actualizar un campo vaco con el valor de otro


El archivo TXT en el que me mandan los corredores ciclistas desde la federacin,
est separado por comas y su formato es dorsal, nombre, apellido1, apellido2,
etc., esto hasta aqu es correcto, luego yo importo estos datos a la tabla Firebird
correspondiente y funciona de perlas pero he detectado que los corredores
extranjeros que tienen un solo apellido, este no figura en apellido1 sino en apellido
2, con lo cual si hago una bsqueda a estos no los encuentro jams ya que el
valor es vaco, como ejemplo:
1
2
3
4

Josep, Fernndez, Alberti, etc.


Lio, Chin, etc.
Johnny, Walker, etc.
Antonio, Gmez, Prez, etc.

Lo que yo necesitara sera que una vez


importados los datos a la tabla, pudiera recorrer
la tabla y cambiar el valor de los registros 2 y 3

(que son los que estn vacos en apellido1) y que la tabla quedara as:
1
2
3
4

Josep, Fernndez, Alberti, etc.


Lio, Chin, etc.
Johnny, Walker, etc.
Antonio, Gmez, Prez, etc.

He probado con UPDATE si campo apellido 2 =


vaco que apellido 1=apellido2 y luego apellido2 =
vaco, pero claro me los cambia todos.

Si lo has hecho as te quedara que todos los que tengan el apellido2 vaco
tambin tengan vaco el apellido1 y por si acaso no estaba suficientemente vaco
el apellido2 lo vuelves a vaciar. Creo que sera algo como
UPDATE corredores SET apellido1=apellido2,apellido2=''
WHERE apellido1 IS NULL

Supongo que con algo as funcionara dando por hecho que realizar la primera
actualizacin antes que la segunda.
Tambin podra hacer la comprobacin a la hora de volcar los datos a la tabla
Firebird, no s cmo haces el traspaso de un lado a otro pero doy por sentado que
en algn momento podras meter la comprobacin.
Por ltimo podras hacer que al buscar por apellido no hagas dos campos de
bsqueda, uno para el apellido1 y otro para el apellido2, yo pondra un solo campo
que sera apellido y luego buscara en la tabla coincidencias en los dos campos.
SELECT * FROM corredores
WHERE apellido1 LIKE '%ernandez%' OR apellido2 LIKE '%ernandez%'

Como guardar desde un DateTimePicker a una base de datos


Quiero pasar la fecha que tengo en DateTimePicker1 a una base de datos Firebird
desde mi botn guardar
ff (BAcceso.Connected)then
begin
QAcceso.Database:=BAcceso;
QAcceso.Transaction:=TAcceso;
QAcceso.SQL.Text:='insert into UNO(FECHA)
values('+QuotedStr(FormatDateTime('mm/dd/yyyy',DateTimePicker1.Date))+')';

QAcceso.ExecSQL;
ShowMessage('Informacion grabada satisfactoriamente');
end;

Como pasarle un valor a un ComboBox desde un campo


Estoy programando con los componentes estndar para recuperar los datos de
unos varios campos de una Base de datos, no s por qu con un ComboBox no le
puedo pasar un valor extrado de un campo y en dado caso a veces me sale el
desplegado de tem que tiene ese ComboBox otras no. Supongo que tu
ComboBox se llama txtEQ_SO, trata con:

txtEQ_SO.Items.Add(' ');

Con esto debera incrementar la lista de lo que hay en el ComboBox, dentro de los
parntesis de este pones lo que vas a adherir al combo.
Otra idea: Que te parece, borras lo que tienes en el ComboBox y realizas la
consulta por medio de un Query y lo agregas al combo as:
ComboBox.Items.Clear;
With IBQuery do
begin
Close;
Sql.Clear;
Sql.Add('SELECT campo FROM tabla');
Open; First;
If Not IsEmpty Then
begin
While Not EOF do
begin
ComboBox.Items.Add(FieldByName('campo').AsString);
Next;
end;
end;
end;

Asignar a campo un SELECT MAX


El problema radica en que son incompatibles los tipos de datos dado que
item_prodespera un dato entero y asignarle ese SELECT no es correcto. Como
debo hacer para que item_prod tome el valor Integer que devuelve el SELECT?
Tienes que poner tu cdigo en un IBQuery
'SELECT MAX (item_prod) AS mayor FROM prod '

Luego brela, y por ultimo


procedure TForm6.Button1Click(Sender: TObject);
begin
IBQuery.Close;
IBQuery.Open;
band := DBLookupComboBox1.KeyValue;
IBDataSet1.Append;
DBLookupComboBox1.KeyValue := band;
IBDataSet1.FieldByName('item_prod').AsInteger :=
IBQuery.Fieldbyname('mayor'). asInteger;
end;

Consulta en Firebird
Tengo una tabla personas y otra personas-operaciones Firebird personas (idnombre) personas-operaciones (idpersona-tipooperacion-lugar-descripcion).

Como se puede realizar un SELECT, que muestre todas las personas que
coincidan independientemente de cuantas lneas como parmetro quiera
introducir.
SELECT DISTINCT...
FROM INNER JOIN...
WHERE
AND
personas-operacion.lugar =: lugar
AND
personas-operacion.descripcion =: descripcin

Ah solo me traera las que tengan una determinada operacin y si quisiera


ampliar y detallas ms operaciones, y me traiga las que cumplen con ambas o
todas las que agregue. Puedes usar:
personas-operacion.tipooperacion
IN (:tipo1, :tipo2, :tipo3, :tipo4, :tipo5)

As podrs seleccionar personas que colaboran en varias operaciones (puedes


poner a NULL los parmetros que no necesites en un momento dado).
Consulta para contar registros
Necesito saber cuntos registros hay en una tabla filtrada por un campo de la
misma, es decir:
ID
1
2
3
4
5
6

CODIGO
2
2
3
3
3
4

AO
2009
2010
2008
2009
2010
2010

El resultado que quiero obtener es:


CODIGO
2
3
4

VECES
2
3
1

SELECT codigo, COUNT(codigo) AS veces FROM mi_table GROUP BY codigo

Ese sera la clusula SQL. Lo importante aqu es el GROUP BY, que se utiliza
para agrupar registros y con la combinacin de la funcin COUNT, obtienes lo que
deseas.

Convertir la primera letra mayscula y las dems minsculas


Tal como te dice Casimiro tienes que usar las funciones UPPER Y LOWER.
UPDATE empleados
SET nombre = LEFT(UPPER(nombre),1) ||
RIGHT(LOWER(nombre),CHAR_LENGTH(nombre)-1) WHERE empleados_id = 1

Actualizar un campo que contiene informacin extra


Ejemplo: realizar un UPDATE y dejar solo la palabra Madero
Nombre
C. Carlos Cuaron

Direccin
Colonia Madero #222

UPDATE colonias SET direccion='Madero' WHERE direccion IN


(SELECT direccion FROM colonias WHERE direccion LIKE '%Madero%')

Aunque personalmente creo que es mucho ms simple y elegante esta otra:


UPDATE colonias SET direccion = 'Madero'
WHERE direccion CONTAINING 'Madero'

Formato en centenas, decimales y unidades


Tengo un campo Char con estos datos 85.12 o tambin con 115.12 como valores
y necesito que pasarlo a este 008512 o en el caso 011512 no se si tendra que
hacerlo en un If o si hay una funcin para hacerlo. Simplemente multiplica el
nmero por 100.
SELECT lpad((CAST(lpad((numero*100), 6, '0') AS Integer)),6,'0')
FROM A_tabla

Firebird sentencia: buscar coincidencias en una columna


Quisiera hacer una consulta de una tabla para extraer los registros que ms
coincidan en una columna con la frase que busco. Imagino que es algo como lo
que suelen hacer los buscadores tipo Google. Es decir, si por ejemplo busco en
una tabla de entidades la entidad: 'palabra1 palabra2 palabra3'
Quisiera que la consulta me mostrara los resultados que encuentre en la tabla
ordenado de mayor coincidencia a menor coincidencia, por ejemplo:
palabra2 palabra3 palabra1
palabraX palabra3 palabra2 palabra1
palabra3 palabra2 palabraY
palabra1 palabraZ palabraQ

Observar que el orden del valor del registro puede ser distinto al criterio que
busco, pero debe mostrarme primero los registros que mayor coincidencia tenga.
No, no existe nada similar para Firebird, pero te puedes construir una consulta,
parecida a la que proponas inicialmente, en la que adems calculas el nmero de
coincidencias sobre las palabras buscadas, y ordenas de mayor a menor en
funcin de esas coincidencias. Por ejemplo., para buscar por 3 palabras:
SELECT dir,
(CASE WHEN dir CONTAINING :txt1 THEN 1 ELSE 0 END +
CASE WHEN dir CONTAINING :txt2 THEN 1 ELSE 0 END +
CASE WHEN dir CONTAINING :txt2 THEN 1 ELSE 0 END) AS coincidencias
FROM clientes
WHERE dir CONTAINING :txt1 OR
dir CONTAINING :txt2 OR
dir CONTAINING :txt3
ORDER BY coincidencias DESCENDING

Naturalmente puedes ampliar la consulta hasta 10, 15, 20 o 50 palabras, de


manera que la misma consulta te sirva para cualquier bsqueda que quiera hacer
el usuario (en un momento dado solo tendrs que asignar valor a tantos
parmetros como palabras est buscando el usuario).
Problemas con campos Numeric
Estoy trabajando con Delphi 2010, con Firebird 2.1 e IbExpert personal edition, y lo
que me ocurre es lo siguiente, al crear la base de datos con la siguiente estructura
LOTE VarChar 20
FECHA date
TIPO_DOCUMENTO VarChar 40
NUMERO_DOCUMENTO VarChar 15
CODIGO_PRODUCTO VarChar 20
CANTIDAD Integer
UD_LITROS Numeric 10,3

Al meter datos en IbExpert en el campo Numeric me sale el mensaje,


Cannot post cahges!
There is at least one record with same fields values!

Y al hacerlo desde el programa, no dice nada pero tampoco me registra el valor


introducido. Primero creas un "generator", ejemplo:
CREATE SEQUENCE GEN_lotes_salida_ID;
ALTER SEQUENCE GEN_lotes_salida_ID RESTART WITH 0;
/* Old syntax is:
CREATE GENERATOR GEN_lotes_salida_ID;
SET GENERATOR GEN_lotes_salida_ID TO 0;
*/

Luego creas el trigger:


CREATE OR ALTER trigger trg_lotes_salida_bi0 for lotes_salida
active before insert position 0
AS
BEGIN
NEW.id = GEN_ID(GEN_lotes_salida_ID,1);
END

Filtro por fecha


Uso Firebird, Campos (id, fecha, total). Tengo un formulario y necesito filtrar por
fecha ejemplo (15/10/08), tengo un componente DateTimePicker en el evento
OnChange y cuando trato de filtrar la fecha no la filtra sino que pone el DBGrid en
vaco.
Cuando haces consultas por fechas en Firebird debes pasarle en formato
mm/dd/yyyy. Primero, como dices que existe una factura con la fecha 16/05/2008
(dd/mm/aa), entonces prueba tu Query as:
SelectSQL.Add('where Fecha = cast(''' + '05/16/08' + ''' as date)');

Si es que ahora ya te filtr correctamente, entonces prueba el siguiente cdigo:


SelectSQL.Add('where Fecha = cast(''' + FormatDateTime('mm/dd/yy',
f_actual.Date) + ''' as date)');

Fecha y Hora al insertar registros


Uso InterBase 7, y tengo la necesidad de saber fecha y hora en que se agreg un
registro. En Firebird empleo una solucin, en todas mis tablas tengo este par de
campos y los lleno con un disparador Before Insert-Update:
USUARIOMODIFICACION
FECHAMODIFICACION

VARCHAR(31) NOT NULL


TIMESTAMP NOT NULL

CREATE TRIGGER tgbiucontratousuariom FOR contrato


ACTIVE BEFORE INSERT OR UPDATE POSITION 0
As
Begin
New.UsuarioModificacion = Current_User;
New.FechaModificacion = Current_TimeStamp;
End

Actualizar Campo Fecha Automticamente


Estoy diseando una base de datos en Firebird 2.0 y en una tabla necesito crear
un campo tipo date el cual se actualice automticamente todos los das con la
fecha del da.

Si solamente es para capturarla ms tarde, siempre puedes utilizar la variable de


contexto llamada current_date de Firebird.
SELECT current_date FROM rdb$database

Consulta filtrada
Tengo problemas al querer filtrar una consulta en Firebird
Datos en tabla:
COD1
COD2
01
001
01
002
02
001
03
001
01
003

REG_ID
1
2
3
4
5

Salida que busco


COD1
REG_ID
01
1
02
3
03
4

SELECT DISTINCT C1.COD1,


(SELECT FIRST 1 C2.ID FROM TBL C2 Where C1.COD1=C2.COD1)FROM TBL C1

Insertar datos de una Tabla a otra usando Where...


Tengo una tabla ciudad con los siguientes campos: ID_Ciudad (auto_increment),
Ciudad, Cdigo_Postal, ID_Provincia, esta tiene unas 18000 localidades.
Por otro lado tengo otra tabla Ciudad2 con los mismos campos con 23000
localidades, mi intencin es insertar las localidades de esta tabla a la primera tabla
de los registros que no estn.
INSERT INTO ciudad (Ciudad,Codigo_Postal,ID_Provincia)
SELECT Ciudad,Codigo_Postal,ID_Provincia FROM ciudad2
WHERE Ciudad NOT IN (SELECT c2.Ciudad
FROM ciudad2 c2 INNER JOIN ciudad c1 ON
(c2.Ciudad=c1.Ciudad AND c2.Codigo_Postal=c1.Codigo_Postal))

Insertar datos en tabla recorriendo un DBGrid


Estoy desarrollando el mdulo de crear usuarios para un sistema de control de
inventario y me han solicitado que un usuario tenga varios perfiles el cual
comprende asociar el departamento ms el rea = perfil, ya tengo eso mi
problema es que no s cmo ingresar esa relacin que la hago en un DBGrid a la
tabla, sea tengo que recorrer todas las lneas del DBGrid e irlas insertando en la
tabla pero no s cmo hacerlo.
begin
dmConecta.qAreaporRol.Close;
dmConecta.qAreaporRol.SQL.Clear;
dmConecta.qAreaporRol.SQL.Add('INSERT INTO AREAPORROL (IDAREAROL,
ID_PERFILES, ID_ROLES, ID_USUARIO, ID_DEPTO)');

dmConecta.qAreaporRol.SQL.Add('VALUES (:IDAREAROL, :ID_PERFILES,


:ID_ROLES, :ID_USUARIO, :ID_DEPTO)');
dmConecta.qAreaporRol.Prepare;
with DBGrid1.DataSource.DataSet do
begin
DisableControls;
try
First;
while not Eof do
begin
dmConecta.qAreaporRol.ParamByName(':IDAREAROL').Value :=
FieldByName('IDAREAROL').Value;
dmConecta.qAreaporRol.ParamByName(':ID_PERFILES').Value:=
FieldByName('ID_PERFILES').Value;
dmConecta.qAreaporRol.ParamByName(':ID_ROLES').Value
:=
FieldByName('ID_ROLES').Value;
dmConecta.qAreaporRol.ParamByName(':ID_USUARIO').Value :=
FieldByName('ID_USUARIO').Value;
dmConecta.qAreaporRol.ParamByName(':ID_DEPTO').Value
:=
FieldByName('ID_DEPTO').Value;
dmConecta.qAreaporRol.ExecSQL;
Next;
end;
finally
EnableControls;
end;
end;
end;

Pasar de Edit a DBGrid


Tengo varios Edit a los que agrego informacin que tengo en una base de datos lo
que quiero lograr es esa informacin pasarla a un DBGrid en forma de lista cada
dato que vaya necesitando como si fuera una venta
with DBGrid1.DataSource.DataSet do
begin
if not (State in [dsEdit,dsInsert]) then
Edit; // Insert o Append de acuerdo a lo que quieras
FieldByName('Campo1').AsString:= Edit1.Text;
FieldByName('Campo2').AsString:= Edit2.Text;
Post; // si deseas guardarlo aqu
end;

Si quieres poner los valores uno debajo de otro, tenis que incrementar el ndice
de las filas y dejar fijo el de las columnas, por ejemplo:
with StringGrid1 do
begin
Cells[Col, FixedRows ]:= Edit1.Text;
Cells[Col, FixedRows+1]:= Edit2.Text;
Cells[Col, FixedRows+2]:= Edit3.Text;
end;

Y si deseas situarlos uno al lado del otro de izquierda a derecha incrementar el


ndice de las columnas y dejar fijo el de las filas:
with StringGrid1 do
begin
Cells[FixedCols , Row]:= Edit1.Text;
Cells[FixedCols+1, Row]:= Edit2.Text;
Cells[FixedCols+2, Row]:= Edit3.Text;
end;

Desglosar efectivo en billetes y monedas


Sirve para facilitarle el trabajo al cajero cuando va a buscar el dinero de las
nminas al banco, que sepa rpidamente la cantidad de billetes y monedas por
denominacin que tiene que pedir, tambin le sirve para cuando vaya a entregar el
salario a cada trabajador.

procedure TForm1.Desglosar(Importe :Single; var Billetes:array of Single;


var Monedas:array of Single);
var
Dinero,
Desglose :Single;
begin
//****************************** Billetes ******************************
Dinero:=Int(Importe);
//Billetes de 100
if cb100.Checked then
begin
Desglose:=Int(Dinero / 100);
Dinero:=Dinero - Desglose * 100;
Billetes[0]:=Billetes[0] + Desglose;
end;
//Billetes de 50
if cb50.Checked then
begin
Desglose:=Int(Dinero / 50);
Dinero:=Dinero - Desglose * 50;
Billetes[1]:=Billetes[1] + Desglose;
end;

//Billetes de 20
if cb20.Checked then
begin
Desglose:=Int(Dinero / 20);
Dinero:=Dinero - Desglose * 20;
Billetes[2]:=Billetes[2] + Desglose;
end;
//Billetes de 10
if cb10.Checked then
begin
Desglose:=Int(Dinero / 10);
Dinero:=Dinero - Desglose * 10;
Billetes[3]:=Billetes[3] + Desglose;
end;
//Billetes de 5
if cb05.Checked then
begin
Desglose:=Int(Dinero / 5);
Dinero:=Dinero - Desglose * 5;
Billetes[4]:=Billetes[4] + Desglose;
end;
//Billetes de 3
if cb03.Checked then
begin
Desglose:=Int(Dinero / 3);
Dinero:=Dinero - Desglose * 3;
Billetes[5]:=Billetes[5] + Desglose;
end;
//Billetes de 1
Desglose:=Int(Dinero / 1);
Dinero:=Dinero - Desglose * 1;
Billetes[6]:=Billetes[6] + Desglose;
//****************************** Monedas ******************************
Dinero:=(Round((Frac(Importe)*100)));
//Monedas de 0.20
if cb020.Checked then
begin
Desglose:=Int(Dinero / 20);
Dinero:=Dinero - Desglose * 20;
Monedas[0]:=Monedas[0] + Desglose;
end;
//Monedas de 0.05
if cb005.Checked then
begin
Desglose:=Int(Dinero / 5);
Dinero:=Dinero - Desglose * 5;
Monedas[1]:=Monedas[1] + Desglose;
end;
//Monedas de 0.02

if cb002.Checked then
begin
Desglose:=Int(Dinero / 2);
Dinero:=Dinero - Desglose * 2;
Monedas[2]:=Monedas[2] + Desglose;
end;
//Monedas de 0.01
Desglose:=Int(Dinero / 1);
Dinero:=Dinero - Desglose * 1;
Monedas[3]:=Monedas[3] + Desglose;
end;

Una forma de llamarlo:


Desglosar(StrToFloat(Valor.Text), Bill, Mon);

Seleccionar valor en un rango de datos


Necesito filtrar la siguiente informacin, tengo una tabla que tiene los siguientes
campos: SERIE FOLIO_INICIAL FOLIO_FINAL NODECERTIFICADO
X
A
X
Y

1 100 123456789
1 500 965432178
1 400 111118888
1 200 598444444

Necesito Extraer de esta tabla el NODECERTIFICADO conociendo la SERIE y el


folio dentro de un rango, es decir, si tengo SERIE X, FOLIO 255 que el resultado
sea 111118888
SELECT * FROM control_de_folios WHERE SERIE = 'X' AND (FOLIO_inicial <=
255 AND folio_final !< 255)

Seleccionar un dato del DBLookupComboBox y guardar muchos en base de


datos
Tengo una base de datos en Access llamada "Datos" conectada a un ADOQuery,
Esta base contiene una tabla llamada Provincias con los campo id y provincia ya
cargada, y una tabla Ciudades con los campos id y ciudades, con todas las
ciudades del pas ya cargadas.
Lo que quiero lograr es que desde un DBLookupComboBox que estn cargadas
todas las provincias, seleccione una, y en una tabla Persona ya creada, con sus
campos, genere registros con todas las ciudades en el campo ciudad (de la
provincia elegida).

Ejemplo: elijo en el ComboBox una provincia "Crdoba" y al presionar Guardar, se


carguen todas las ciudades de la provincia "crdoba" en el campo ciudad de la
tabla persona.
Si en la tabla CIUDADES, tienes creado un campo PROVINCIA_ID que haga
referencia al campo ID de la provincia a la que pertenece (como creo que sera
lgico). Y en el DBLookupComboBox de provincias, tienes configurada la
propiedad KeyValue para que te devuelva el valor del campo ID de la tabla
PROVINCIAS, podes hacer algo similar a:
procedure TTuForm.btnGuardarClick(Sender: TObject);
begin
with qyNueva do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO TABLA_NUEVA(ID, NOMBRE_CIUDAD, PROVINCIA_ID)');
SQL.Add('SELECT T2.ID, T2.NOMBRE_CIUDAD, T2.PROVINCIA_ID');
SQL.Add('FROM TABLA_CIUDADES T2');
SQL.Add('WHERE T2.PROVINCIA_ID = ' +
QuotedStr(QuotedStr(DBLookupProvincias.KeyValue)));
ExecSQL;
end;
end;

Si los registros de la tabla CIUDADES no tienen un campo que identifique a qu


provincia pertenece, no veo la forma de seleccionar aquellas ciudades que
corresponden a determinada provincia. Lo nico que tendras que agregar es un
campo ms a la tabla CIUDADES para que almacene el ID de la provincia a que
pertenece, por ejemplo:
Tabla CIUDADES:
ID
45
47
51
60

NOMBRE_CIUDAD
Villa Carlos Paz
Federacin
Coronel Vidal
Gonzlez Chvez

PROVINCIA_ID
5
12
3
3

Tabla PROVINCIAS:
ID
3
12
5

NOMBRE_PROVINCIA
Buenos Aires
Entre Ros
Crdoba

Entonces tomando en cuenta el campo de referencia PROVINCIA_ID, ahora si


podemos decir que la relacin est establecida ya que:
Villa Carlos Paz
Federacin
Coronel Vidal
Gonzlez Chvez

Crdoba
Entre Ros
Buenos Aires
Buenos Aires

5
12
3
3

Y por lo tanto solo necesitamos seleccionar de la tabla CIUDADES aquellas cuyo


campo PROVINCIA_ID sea igual al ID de provincia deseado. De forma tal al
cdigo que te puse en el mensaje anterior.
Abrir Form acorde a contrasea
Tengo 2 Formularios (Form1, Form2), en el Formulario1 tengo un Edit y un Botn,
y en formulario 2 no tengo nada, pero bueno la cosa es as, yo le puse una
Contrasea al botn para que al Escribir esa contrasea dentro del Edit1 me salga
un MessageBox que diga, "Contrasea Correcta" y me abra el Form2. Y si la
Contrasea no es Correcta que me salga un MessageBox que diga, "Contrasea
Incorrecta" y que regrese al Form1 hasta que no atine la Contrasea Correcta.
procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text <> 'Esta es la Contrasea' then
messagebox(0,
PChar('Contrasea Incorrecta'),
PChar('Aviso'),
MB_OK)
else
begin
messagebox(0,
PChar('Contrasea Correcta'),
PChar('Bienvenido'),
MB_OK);
Hide;
Form2.Show;
end;
end;

Asignarle el Valor de un DBEdit a un DBGrid


Saben cmo puedo hacer que una columna del DBGrid me copie el Valor que
Tiene un DBEdit.
Table1.FieldByName('Valor').AsString := Edit1.Text;
IBDataSet.FieldByName('Valor').AsString:=DBEdit.Field.AsString

Ayuda con consulta


Tengo dos tablas en Firebird 2.5 as:
Prestadores
Id_Prestador
Prestador

Solicitudes
Integer
VarChar

Id_Solicitud
Id_Prestador
Terminada

Integer
Integer*
VarChar

Ahora bien, el campo "Terminada" de la tabla solicitudes puede albergar los


siguientes valores ('SI', 'NO', 'NO APLICA').

Lo que necesito es una consulta que me cuente el total de solicitudes de cada


prestador, adems de los diferentes valores del campo "TERMINADA" y me los
agrupe por PRESTADORES, ms o menos as:
Prestador
Prestador 1
Prestador 2
Prestador n

Total_Solicitudes_Prestador
10
20
5

Terminada_Si
5
10
3

Terminada_N
4
8
1

Terminada_No_Aplica
1
2
1

SELECT Id_Prestador,
SUM(Terminada) AS TotalTerminada,
SUM(NoTerminada) AS TotalNoTerminada,
SUM(NoAplica) AS TotalNoAplica
FROM (SELECT ID_Prestador,
IIF(Terminada = 'SI', 1, 0) AS Terminada,
IIF(Terminada = 'NO', 1, 0) AS NoTerminada,
IIF(Terminada = 'NO APLICA', 1, 0) AS NoAplica
FROM Solictudes) GROUP BY Id_Prestador

Imgenes en Firebird
Estoy diseando una aplicacin relacionada con el control de personal, el tema es
que el cliente ha solicitado que entre toda la informacin est contenida la foto de
cada trabajador.
En este caso no se utiliza otro campo para el formato. Para probar en un
Formulario (Form1) pones:

Un TOpenPictureDialog y lo nombras TOpenPictureDialog,


Un TButton y Lo Nombras ButtonCargarImagen,
Un TButton y lo Nombras MostrarImagen,
Un TButton y lo Nombras BorrarImagen,
Un TImage y lo Nombras ImageFoto,

Adems en DataModule1 existe una tabla de InterBase IBTPersonas con un


campo tipo Blob llamado Foto (Enlazada a la correspondiente base de datos).
Tambin puedes poner un DBGrid enlazado a la Tabla mediante el DataSource
correspondiente para seleccionar el registro con que quieras experimentar.
Adicionar en el Uses JPEG
Para cargar la Imagen (BMP, JPG, ICO) con el dilogo directamente a la base de
datos:
procedure TForm1.ButtonCargarImagenClick(Sender: TObject);
var
Jpg: TJpegImage;
Stream: TMemoryStream;
FileExt: string;
GraphType: TGraphType;
begin

if OpenPictureDialog.Execute then
begin
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
FileExt := LowerCase(ExtractFileExt(OpenPictureDialog.FileName));
if (FileExt = '.bmp') or (FileExt = '.dib') then
begin
GraphType := gtBitmap;
Stream.Write(GraphType, 1);
with ImageFoto.Picture.Bitmap do
begin
LoadFromFile(OpenPictureDialog.FileName);
ImageFoto.Picture.Bitmap.SaveToStream(Stream);
end;
end
else if (FileExt = '.ico') then
begin
GraphType := gtIcon;
Stream.Write(GraphType, 1);
with ImageFoto.Picture.Icon do
begin
LoadFromFile(OpenPictureDialog.FileName);
ImageFoto.Picture.Bitmap.SaveToStream(Stream);
end;
end
else if (FileExt = '.emf') or (FileExt = '.wmf') then
begin
GraphType := gtMetafile;
Stream.Write(GraphType, 1);
with ImageFoto.Picture.Metafile do
begin
LoadFromFile(OpenPictureDialog.FileName);
ImageFoto.Picture.Bitmap.SaveToStream(Stream);
end;
end
else if (FileExt = '.jpg') or (FileExt = '.jpeg') or (FileExt = '.jpe') then
begin
Jpg := TJpegImage.Create;
Jpg.LoadFromFile(OpenPictureDialog.FileName);
ImageFoto.Picture.Assign(Jpg);
GraphType := gtJpeg;
Stream.Write(GraphType, 1);
Jpg.SaveToStream(Stream);
end;
DataModule1.IBTPersonas.Edit;
Stream.Position := 0;
DataModule1.IBTPersonasFoto.LoadFromStream(Stream);
except
jpg.Free;
Stream.Free;
raise;
end;
jpg.Free;
Stream.Free;

end;
end;

Para Mostrar la Foto almacenada en la base de datos en el TImage:


procedure TForm1.MostrarImagenClick(Sender: TObject);
var
Stream: TMemoryStream;
Jpg: TJpegImage;
GraphType: TGraphType;
begin
Jpg := nil;
Stream := nil;
try
Stream := TMemoryStream.Create;
DataModule1.IBTPersonasFoto.SaveToStream(Stream);
if Stream.Size > 0 then
begin
Stream.Position := 0;
Stream.Read(GraphType, 1);
case GraphType of
gtBitmap: Form1.ImageFoto.Picture.Bitmap.LoadFromStream(Stream);
gtIcon:
Form1.ImageFoto.Picture.Icon.LoadFromStream(Stream);
gtMetafile: Form1.ImageFoto.Picture.Metafile.LoadFromStream(Stream);
gtJpeg: begin
Jpg := TJpegImage.Create;
Jpg.LoadFromStream(Stream);
Form1.ImageFoto.Picture.Assign(Jpg);
end
else Form1.ImageFoto.Picture.Assign(nil); // Limpiar la imagen
end;
end
else Form1.ImageFoto.Picture.Assign(nil);
except
Form1.ImageFoto.Picture.Assign(nil);
end;
jpg.Free;
Stream.Free;
end;

Para Borrar la imagen de la base de datos:


procedure TForm1.BorrarImagenClick(Sender: TObject);
begin
ImageFoto.Picture.Assign(nil);
DataModule1.IBTPersonas.Edit;
DataModule1.IBTPersonasFoto.Assign(nil); // Limpiar el campo
end;

Controlar DBLookupComboBox
Cargo un DBLookupComboBox desde la BD sin problemas, en la lista tenemos
varios tems, cuando el usuario selecciona un elemento de la lista, el sistema se
detiene y le pregunta si est seguro de cambiar de tem, esto se hace porque si el

tipo responde que "si" algunas cosas del formulario cambian; y si responde que
"no" el formulario no debera cambiar y el elemento visible en el combo tampoco
debera cambiar al que seleccion.
Resulta que si respondo que "si", no hay problema, pero cuando respondo que no,
los cambios en el formulario no se hacen pero el elemento visible cambia, y yo no
quiero que cambie. Lo que necesito es que cuando responda que "no" el combo
ponga visible la opcin que estaba antes de hacer clic en l.
var
OldKeyValue: string;
procedure TForm1.DBLookupComboBox1Enter(Sender: TObject);
begin
OldKeyValue:= VarToStr(DBLookupComboBox1.KeyValue);
end;
procedure TForm1.DBLookupComboBox1Click(Sender: TObject);
begin
if MessageBox(Handle,' Desea cambiar de tem?',
'',MB_ICONQUESTION+MB_YESNO) = IDNO then
DBLookupComboBox1.KeyValue:= OldKeyValue
else
OldKeyValue:= VarToStr(DBLookupComboBox1.KeyValue);
end;

Cargar ComboBox con datos de tabla


Tengo una tabla y necesito cargar un ComboBox con un campo de la tabla, he
ledo por ah del DBLookupComboBox pero este necesita que la tabla tenga una
primary key definida no?, es decir tengo un campo categora, y necesitara agregar
de la tabla las categoras sin que se repitan.
With dbgrid1.datasource.dataset do begin
try
DisableControls; //Deshabilitamos los controles asociados a ese
DataSet
First;
While not eof do begin
if Ccat.Items.IndexOf(FieldByName('Categoria').AsString)=-1 then
Ccat.Items.Add(FieldByName('Categoria').AsString);
Next;
end;
finally
EnableControls;
//habilitamos nuevamente los controles

end;

Agregar Filas a TDBGrid segn Filtro Bsqueda


Estoy realizando un formulario de "Prstamo de Libros" y dentro de ello, tengo un
control TEdit llamado "txtfiltro" que realiza una bsqueda exacta de un campo
determinado en mi IBQuery (qConsultar).
Select * From libros
Where
libros.isbn_lib Like '%' || :xisbn || '%'
Esta consulta me trae varios datos cmo: "Nombre Autor", "Ttulo Libro", "Cdigo
ISBN", "Temtica", "Ubicacin del Libro". Ahora lo que se requiere es que si la
consulta arroja resultados (es decir, encuentra un Libro), esto debe mostrarse en la
Grilla que tiene por nombre "grillaPrestamo" (componente TDBGrid).
Cmo puedo hacer para que en la grilla me muestre los datos del libro encontrado?
y adems de ello, poder registrar OTRO libro, y otro ms.
Es muy utilizada en bsquedas incrementales (no muy eficientes) la cul podes
implementar de este modo:
1) Un IBQuery asociado a un DataSource y un TDBGrid asociado al anterior.
TIBDataBase <- TIBTransaction <- TIBQuery <- TDataSource <- TTDBGrid
Agregar un TEdit con este cdigo en su evento OnChange:
procedure TForm1.Edit1Change(Sender: TObject);
begin
with IBQuery1 do
begin
Close;
SQL.Text:= 'Select * From libros Where isbn_lib like :xisbn';
ParamByName('xisbn').AsString:= '%' + Edit1.Text + '%';
Open;
end;
end;
As a medida que vas ingresando caracteres en el Edit se va filtrando el resultado y
se ve reflejado en el TDBGrid.
Buscar valores ms cercanos
Tengo la necesidad de buscar en una tabla (Firebird) por un campo que es numrico
y tengo que buscar en un momento determinado los valores ms 'prximos'. Por
prximos quiero decir los valores que se acercan ms a un valor, tanto por delante
como por detrs.

Ejemplo: Si tengo una tabla con el campo1 tipo Integer y con estos datos.
Campo1 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Como podra buscar u obtener la tabla ordenada por el criterio de proximidad a un
valor, por ejemplo del 5:
Campo1= 4, 6, 7, 3, 8, 2, 9, 1, 10
Select campo1,
Case When (campo1 - :valor) > 0 Then campo1 :valor Else -1 * (campo1 - :valor)
From tabla
Order By 2
Agregar Nombre a las columnas de Un TDBGrid en Tiempo de Ejecucin
No encuentro la manera de agregar nombre a las columnas de un TDBGrid en
tiempo de ejecucin.
procedure TForm1.Button1Click(Sender: TObject);
begin
TDBGrid1.Columns[1].Title.Caption:='Clientes';
end;
Agrupar datos
Tengo una tabla de devoluciones al Almacn y esta es su detalle, en la consulta que
necesito, quiero agrupar los artculos que tengan la misma caracterstica en cuanto a
Nombre, Largo y Ancho.
Folio
1.1
2.1
2.2
3.1
4.1
4.2
4.3

Nombre
Cartulina doble
Cartulina doble
Jac Cromo
Laminado
Couche
Laminado
Jac Cromo

Cantidad
5
7
5
2
7
2
9

Largo
1200
1200
1000
1000
1500
1000
1000

Ancho
0.140
0.140
0.110
0.120
0.150
0.120
0.110

Fecha
02/06/03
03/06/03
03/06/03
09/06/03
01/07/03
01/07/03
01/07/03

Select nombre, largo, ancho, Sum(cantidad), Min(fecha), Max(fecha)


From tutabla
Group By nombre, largo, ancho

TQuery con parmetro


Existen 2 tipos de acceso a Parmetros: en diseo y con cdigo. En diseo se
recurre a la propiedad Params del Query. Se abre su editor y aparece su ventana.

Debemos asignar Type: String; Nombre del Parmetro, y su valor Unknown, luego
en cdigo podemos hacer referencia a l a travs de QueryX.Params[0] asignndole
el valor actual. Previo a esto debemos:
Query.Close;
Query.Clear;
Params[0].Value:=XXX;
Query.SQL.Add('Select campos From table Where campo
= :XXX');
Query.Open;

Cerrar
Limpiar
Asignar el parmetro
Estamento SQL
Abrir

No debemos olvidar si el valor del Query pasa a un ClientDataSet de cerrar y abrir


este tambin para que se renueven los datos que este ltimo enva al DataSource
que a su ve los pasa al TDBGrid.
Si es por cdigo debemos usar un valor ms exacto al parmetro, para ello nos
apoyamos en un campo explcito. Para esto usamos la localizacin del parmetro.
Query1.ParamByName('ParamName').AsMoldeador:='ValorActuall';
Usando TIBQuery:
begin
with IBQuery1 do
begin
Close;

SQL.Text:= 'Select * From wb Where Item Starting With :cInicial';


ParamByName('cInicial').AsString := cIni;
Open;
end;
end;
Usando TIBDataSet:
begin
with IBDataSet1 do
begin
Close;
SelectSQL.Text:= 'Select * From wb Where Item Starting With:cInicial';
ParamByName('cInicial').AsString := cIni;
Open;
end;
end;
La ventaja del TIBDataSet es que dando valor a la propiedad SelectSQL en diseo,
te permite usar la herramienta DataSetEditor, con la que podrs generar con muy
poca intervencin las sentencias para insertar, modificar y borrar datos. Esto no es
as para el TIBQuery donde tendrs que definir las sentencias manualmente.
Los parmetros se definen en la consulta y siempre se escriben precedidos por dos
puntos ':'. La consulta se puede asignar en tiempo de diseo o en tiempo de
ejecucin. Si en tiempo de diseo, desde el Object Inspector, asignamos a la
propiedad SQL el valor:
Select * From tabla Where name = :pname
Se habr creado un parmetro llamado "pname", cosa que podes comprobar desde
el mismo Object Inspector haciendo clic sobre los '...' de la propiedad Params.
Habiendo sido creado la consulta y su parmetro, se puede llamar bien por su
propiedad vectorial Params:
with IBQuery1 do
begin
Close;
Params[0].AsString := Edit1.Text;
Open;
end;
O bien mediante el mtodo ParamByName:

with IBQuery1 do
begin
Close;
ParamByName('pname').AsString := Edit1.Text;
Open;
end;
De otro modo, si consulta y parmetro son creados en tiempo de ejecucin, se
deben especificar ambos, mediante la propiedad vectorial Params:
with IBQuery1 do
begin
Close;
SQL.Text := 'Select * From tabla Where name = :pname';
Params[0].AsString := Edit1.Text;
Open;
end;
Mediante el mtodo ParamByName:
with IBQuery1 do
begin
Close;
SQL.Text := 'Select * From tabla Where name = :pname';
ParamByName('pname').AsString := Edit1.Text;
Open;
end;
Y es mediante la propiedad ParamValue:
with IBQuery1 do
begin
Close;
SQL.Text := 'Select * From tabla Where name = :pname';
Params.ParamValues['pname'] := Edit1.Text;
Open;
end;
Por ltimo cabe acotar que si existe una definicin de consulta/parmetros en tiempo
de diseo, al asignar una nueva definicin de consulta/parmetros en tiempo de
ejecucin, se sobrescribir lo realizado en tiempo de diseo.

Consulta con varias tablas


Tengo que generar una consulta que une 3 tablas: Horarios, Citas y Pacientes. En
Horarios se encuentra una lista de "horas" para un da de la semana X: 9:00, 9:30,
10:00...19:30 en fin las horas de inicio de las citas (cada 30Min) y cada una tiene un
IDHorario nico. En Citas tengo los campos: IdCita, fecha, IdHorario y ID Paciente.
En Pacientes tengo IdPaciente, Nombre. Lo que Quiero Obtener es una consulta
(simplificando las cosas) que tenga para una fecha dada:
idHorarios.Hora IdPaciente.Nombre
9:00
<null>
9:30
Pedro Perez
10:00
<null>
....
....
19:30
<null>
Select h.hora, p.nombre, p.apellido
From horarios h
Left Join citas c On h.idhorario = c.idhorario
Left Join pacientes p On c.idpaciente = p.idpaciente
Where diasem = 1 And idarea = 1
Query con 3 tablas
Tengo un sistema para llevar remisiones (facturas), productos, clientes, etc.; el
problema est en que estoy haciendo una pantalla donde tengo un TDBGrid,,
cuando remisiono un producto o ms, guardo la clave de cliente que remisiona,
guardo la clave de producto, y la cantidad de producto, esto se guarda en detalle
remisin, ahora lo que quiero hacer es jalar en la pantalla, el nombre de cliente, su
saldo, y la cantidad acumulada que ha sumado el cliente de todas sus remisiones,
solo me tiene que mostrar la cantidad de ciertos productos (especficamente del 1 y
2), Les dir que tablas son con las que interactu en esa pantalla. Solo pondr los
campos que necesitamos.
Clientes (cvecli, razso(es el nombre), saldo)
Remisiones (cverem, cvecli)
Detalle_remision(cverem, cvepro(clave del producto), cantidad)
Select cverem, Sum(canti), c.cvecli, c.razso, c.saldo
From remisiones r, detalle_remision d, clientes c
Where r.cverem = d.cverem And r.cvecli= c.cvecli
Group By cverem
Select clientes.cvecli, clientes.razso, Sum(detalle_remision.cantidad)
As cantidadtotal, clientes.saldo
From clientes

Inner Join remisiones On clientes.cvecli=remisiones.cvecli


Inner Join detalle_remision On remisiones.cverem=detalle_remision.cveremv
Group By clientes.cvecli, clientes.razso, clientes.saldo
Query con 2 o ms tablas
Debo mostrar en un TDBGrid, los datos de la consulta de un Query, los registros de
caja, pero en vez de los cdigos de cliente y cobrador debe mostrar sus nombres,
para eso deber tomar el cdigo de caja y localizar en las otras 2 tablas sus
nombres.
Select a.idcaja, b.cliente, c.colaborador
From cajas as a
Inner Join clientes As b On b.idcliente = a.clienteid
Inner Join colaboradores As c On c.idcolaborador = a.colaboradorid
Ocultar columnas en TTDBGrid
Tengo un TDBGrid donde mostrar los datos de una serie de sentencias SQL, que
dado el valor de un TComboBox, se debe o no mostrar una columna de la rejilla, es
decir, si el valor del TComboBox es "Mostrar", se mostrar la columna, si es
"Esconder" o ningn valor, la columna no debe aparecer en el TDBGrid.
TDBGrid1.Columns[0].Visible := False;
Realizar bsqueda en Firebird
Tengo una tabla en Firebird 2.5, y quiero realizar dos tipos de bsqueda: El primero
por el cdigo (campo clave) y el segundo es por nombre de producto. Un ejemplo
con TIBDataSet:
procedure TForm1.Edit1Change(Sender: TObject);
begin
IBDataSet1.Close;
IBDataSet1.SelectSQL.Text:= 'Select * From productos Where nombre
Like :buscado';
IBDataSet1.ParamByName('buscado').AsString:= Edit1.Text+'%';
IBDataSet1.Open;
end;
Toma en cuenta que en este caso la cadena SQL que originalmente le asignaste a la
propiedad SelectSQL es reemplazada por cada nueva asignacin.

TDBGrid con campo de numeracin


Hacer clic derecho en el TDBGrid y elija Columns Editor....

En Columns Editor.... mostrado, hacer clic con el botn derecho y elija la opcin Add
All Fields, o pulsa el botn rodeado en rojo mostrado en la imagen.

Se agregarn las columnas persistentes al TDBGrid segn los campos detectados


de su DataSet, agregue otra columna a TDBGrid1, y muvalo hacia arriba.

D un ttulo esta nueva columna. Use la propiedad Title.Caption de la columna para


hacer esto.

Ahora localize en el TDBGrid el evento OnDrawColumnCell en el Object Inspector,


y haga doble clic y pege lo siguiente.
procedure TFormMain.TDBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
vTDBGrid: TTDBGrid absolute Sender;
begin
if DataCol=0 then
vTDBGrid.Canvas.TextOut(Rect.Left + 2, Rect.Top + 2,
IntToStr(vTDBGrid.DataSource.DataSet.RecNo));
end;
Consulta con dos tablas
Tengo dos tablas una se llama "Correo_Contactos" y la otra "Correo_Entrada"
Correo_Contactos Correo_Entrada
nombre
correo
correo
mensaje
cod
Como hago para que me muestre todos los correo recibidos sin importar si los tengo
agregados.

Select correo_contactos.nombre, correo_contactos.correo, correo_entrada.mensaje


From correo_entrada
Left Join correo_contactos On correo_contactos.correo = correo_entrada.correo
Store Procedure en Consulta
Es posible utilizar un Store Procedure dentro de una sentencia SELECT,
osaldoafcxc(a.clv_clie,:fecha) es un procedimiento que me devuelve el saldo a fecha
de un cliente.
Select
a.clv_clie, a.no_fact, (select * From osaldoafcxc(a.clv_clie,:fecha))
From cuent1 a , conc1 b
Where b.tipo = 'c' And a.tipo_mov = b.num_cpto And b.con_refer = 'n'
Pintar TDBGrid dependiendo del valor de un registro
Tengo un Cd con un campo que tiene un valor y dependiendo de ese valor pongo el
color de la fila.
Crea una nueva aplicacin, agrega un TClientDataSet, un TDataSource, un TTimer
un TTDBGrid, luego haz doble clic sobre el TClientDataSet, Clic botn derecho ->
Clic sobre "New Field..." Name: OR_TIPO, Type: Integer, Clic sobre botn Ok.
Asocia el TDBGrid al DataSource y este al ClientDataSet para poder visualizar el
resultado, y luego prueba este ejemplo:
implementation
const
MAX = 200;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
Timer1.Enabled := False;
Randomize;
with ClientDataSet1 do
begin
CreateDataSet;
Open;
for i:= 1 to MAX do
begin
Append;
FieldByName('OR_TIPO').AsInteger := Random(5)+1;
Post;

end;
First;
end;
Timer1.Interval := 3000;
Timer1.Enabled := True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i: Integer;
begin
Timer1.Enabled := False;
with ClientDataSet1 do
begin
DisableControls;
try
First;
for i:= 1 to MAX do
begin
Edit;
FieldByName('OR_TIPO').AsInteger := Random(5)+1;
Next;
end;
First;
finally
EnableControls;
end;
end;
Timer1.Enabled := True;
end;
procedure TForm1.TDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
C : TColor;
begin
with Sender as TTDBGrid do
begin
case ClientDataSet1.FieldByName('OR_TIPO').AsInteger of
1: C:= clLime;
2: C:= clYellow;
3: C:= clMoneyGreen;
4: C:= clRed;
5: C:= clAqua;
end;
Canvas.Brush.Color := C;

DefaultDrawColumnCell(Rect, DataCol, Column, State);


end;
end;
Mostrar una tabla en un TDBGrid por cdigo
Como muestro la siguiente tabla en un TDBGrid, pero que sea por cdigo.
id_materia
nombre
ihs
area
procedure TForm1.Button1Click(Sender: TObject);
begin
DataSource1.DataSet:= IBQuery1;
TDBGrid1.DataSource:= DataSource1;
with IBQuery1 do
begin
Database:= IBDatabase1;
Transaction:= IBTransaction1;
Close;
SQL.Text:= 'Select id_materia, nombre, ihs, area From tu_tabla';
Open;
end;
end;
Llenar TDBGrid en tiempo de ejecucin
Necesito que me muestre solo una columna.
with TDBGrid1 do
begin
DataSource:= meta.DataSource;
Columns.Clear;
Columns.Add; // <- Agregar nueva columna
Columns[0].FieldName:= 'TABLE_NAME';
Columns[0].Width:= 150;
Columns[0].Title.Caption:= 'Nombre de la tabla';
Columns[0].Title.Color:= clLime;
Columns[0].Color:= clMoneyGreen;
end;

Ejecutar script SQL en firebird


Tengo un script nombre.sql, donde tengo varias rdenes de cambios en base de
datos (Alter Table, Create Procedure, Insert Into, etc.), como se puede ejecutar un
script SQL por cdigo.
IBScript1.Script.LoadFromFile('archivo.sql');
IBScript1.ExecuteScript;
Ejecutar Script con IBSQL
Se puede ejecutar Script con el componente IBSQL, he intentado crear un Store
Procedure y me falla la primera lnea (SET TERM^), sin embargo cuando creo una
Base de Datos todo es correcto, el mismo Script con IbExpert lo crea perfectamente.
Si, slo es necesario que pongas la propiedad ParamCheck a False antes de
ejecutarlo.
with IBSQL1 do
begin
Close;
ParamCheck:= False;
SQL.Add('Create Procedure sp_pi Returns(Result Double Precision)');
SQL.Add('As');
SQL.Add('begin');
SQL.Add('result = ''3.141592654'';');
SQL.Add('end');
ExecQuery;
end;
Luego:
IBStoredProc1.StoredProcName:= 'SP_PI';
IBStoredProc1.ExecProc;
ShowMessage(FloatToStr(IBStoredProc1.Params[0].Value));
Ocultar columna en TDBGrid
Como se oculta una columna en tiempo de ejecucin en el TDBGrid
En el TDBGrid existe una propiedad llamada Columns que es un array que contiene
todas las columnas que existen en el TDBGrid. Si pones la columna que quieres
(piensa que el array tiene base 0) su propiedad Visible a false, esta desaparecer.
TDBGrid1.Columns[x].Visible:=False;

Seleccionar un tems en ComboBox y aadir muchos registros en tabla


Tengo una BD en Access conectada con un ADOQuery, esta contiene una tabla
provincias con los campos provincia, id_prov otra tabla llamada ciudades con los
campos ciudad, id_ciudad, id_prov. Quiero seleccionar una provincia desde un
ComboBox y que en una tabla nueva ya creada con un campo ciudades y otros
campos, me copie todas las ciudades de la provincia elegida en el campo ciudades.
Insert Into nueva_tabla (campo1, campo2) Select campo1, campo2
From ciudades
Where id_prov = :id_prov
Agregar datos al TDBComboBox en ejecucin
Tengo un TDBComboBox que se llama ao, por medio de la propiedad tems, estn
agregados los aos desde 1900 hasta 2013, un botn modificar y que pueda
agregarle ms aos al TDBComboBox, pero ejecutndose programa.
Para insertar al inicio el tem usa:
DBComboBox1.Items.Insert(0, '2014');
Para que los tems agregados se guarden usa esto:
DBComboBox1.Items.SaveToFile('c:\dbcomboboxitems.txt');
Y para cargar los tems que guardaste usa esto:
if FileExists('c:\dbcomboboxitems.txt') then
DBComboBox1.Items.LoadFromFile('c:\dbcomboboxitems.txt');
TDBGrid: Mostrar un campo u otro dependiendo de una condicin
Tengo una tabla con dos campos nombre: "nombre" y "nombre_nuevo" y un
TDBGrid donde una de las columnas tiene el FieldName=nombre. Lo que pretendo
es que si el campo nombre est vaco me muestre el campo nombre_nuevo.
procedure TPadronBuscaHistoria.GridHistoriaDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if (DataCol = 5) and
(Trim(QueryHa.FieldByName('nombre').AsString) = '') then begin
GridH.Canvas.TextRect(Rect,Rect.Left + 8, Rect.Top+5,
QueryH.FieldbyName('nombre_nuevo').AsString);
end;
end;

Columnas de DBGrid en tiempo de ejecucin


En tiempo de ejecucin creo en un DBGrid de 2 columnas a las cuales les asigno un
campo de una tabla, el problema es que quiero cambiar el ttulo de las columnas.
dbgListado.Columns[0].Title.Caption:='Codigo';
dbgListado.Columns[1].Title.Caption:='Nombre';
Consulta de dos tablas
Tengo dos tablas, Camiones con los campos ID_CAMION, MARCA, MODELO y la
tabla Cdigos con los campos ID_CODIGO, ID_CAMION, CODIGO. Que registros
de la tabla camiones no figuran ninguna vez en la tabla cdigos, es decir el que
ID_CAMION de la tabla Camiones no tenga correspondencia con ningn valor de la
tabla cdigos. Ejemplo
Tabla Camiones
ID_Camion Marca
1
Mercedes Atego
2
Pegaso
3
Iveco Trakker
4
Mecedes Atego

Modelo
1528
1180
1528

Tabla Cdigos
ID_Codigo ID_Camion Cdigo
1
1
23

40

En la consulta deberan aparecer los registros 2 y 4 de la tabla camiones.


Select * From bom0001
Where id_camion Not In (Select id_camion From bom0001a)
Consulta de varios registros y como resultado varias columnas
Tengo la siguiente tabla:
Cdigo
001
001
001
002
002
002
003
003
004
004

Lectura
3400
3600
3350
1500
1600
1250
1000
0950
1000
1250

Fecha
01/01/2008
01/02/2008
31/12/2007
01/01/2008
01/02/2008
31/12/2007
31/12/2007
01/11/2007
01/11/2007
31/12/2007

Se necesita hacer una consulta que genere la salida, suministrando como parmetro
fecha1 y fecha2: Parmetros:
fecha1: 01/01/2008 - fecha2: 01/02/2008

Cdigo Fecha1(01/01/2008) Fecha2(01/02/2008)


001
3400
3600
002
1500
1600

Consumo
200
10

Explicacin: En el caso del primer cdigo (001):


Reg. No. 1: 001-3400-3600-200
La primera columna: es el cdigo que se encuentra en la tabla. (001)
La segunda columna: corresponde a la lectura que coincide con la fecha1. (3400)
La tercera columna: corresponde a la lectura que coincide con la fecha2. (3600)
La cuarta columna: se debe generar la resta de la tercera columna con la segunda
columna (3600-3400)=200 y as contina con el cdigo (002) y fjense que las
lecturas con fecha que no estn indicadas, no se muestran en la salida (como lo es
el caso de las lecturas con fecha: 31/12/2007.
Select d.ruta As ruta,d.codigo_do As codigo_do,sus.nombre_fiscal As nombre,
d.descripcion As direccion, t1.lectura, t2.lectura, (t1.lectura-t2.lectura) As consumo,
t1.fecha, t2.fecha
From direccion_operacional d
Left Outer Join suscriptores sus On sus.id = d.id_suscriptor
Left Outer Join lecturas t1 On t1.codigo_do=d.codigo_do
Left Outer Join lecturas t2 On t2.codigo_do=d.codigo_do
Where (t1.fecha= :fecha1 And t2.fecha= :fecha2) And (d.tipo_tarifa=:tarifa) And
(d.ruta>=:ruta1 And d.ruta<=:ruta2)
Consulta de artculos vendidos en un da
Necesito hacer es una consulta la cual me permita obtener los artculos vendidos en
un da. Lo que hago es lo siguiente: seleccion un rango de fecha, desde/hasta y me
devuelve todos los registros vendidos desde que se implement el sistema, y no es
lo que necesito. Realizo la consulta sobre las tablas facturas que contiene los
siguientes campos, nrofactura, fecha, total, tipo_fac y la tabla detalles, que contiene
los siguientes campos, id_det, descripcion, subtotal, cantidad, nrofactura.
Select b.descripcion, Sum(b.cantidad)
From tfacturas a
Inner Join tdetalles b On a.nrofactura=b.nrofactura
Where a.fecha Between :vfec1 And :vfec2
Group By b.descripcion
Consulta para conocer la cantidad de ventas
Tengo una tabla MySQL donde se refleja por cada tems de compra un nmero de
ventas, lo que sucede es que este nmero de ventas se repite para cada registro,
por ejemplo si un cliente compra 4 productos en una venta (facturas) los 4 registros
obtienen el mismo nmero de la venta, pero la venta sera una sola, como puedo
hacer con una consulta para conocer la cantidad de ventas de un cliente (ventas

fsicas en el ejemplo sera 1 y 4), porque lo que estoy obteniendo es la cantidad de


tems de la venta.
Select cliente, Count(Distinct numeroventa)
From ventas
Group By cliente
Consulta la cantidad de ventas
Se trata de un informe en el cual tengo que mostrar mediante un Group By todos los
artculos de la base de datos con sus cantidades vendidas respectivamente. Por
ejemplo tengo las siguientes tablas (simplificadas), tambin me gustara poder filtrar
por fecha o mes (realizando la misma consulta).
LineaVta
Artculos
CodArticulo CodArticulo
Cantidad
Nombre
Select nombre, codigo, Sum(cantidad)
From LineaVta, Articulos
Where LineaVta.CodArticulo = Articulos.CodArticulo
Group By nombre, codigo
Consulta por Mltiples campos
Tengo un panel con varios campos y un DBGrid, lo que necesito es realizar una
consulta no importa cual campo este lleno, puede ser uno como todos, algunos o
nada (en la condicin de nada debera traer todos los registros): numero, nombre,
apellido, documento.
with tu_Query do
begin
Close;
SQL.Clear;
SQL.Add('Select * From tu_tabla');
SQL.Add('Where numero campo1 :p1 And nombre Like :p2');
SQL.Add('and apellido Like :p3 And documento Like :p4');
ParamByName('p1').AsString := Edit1.Text + '%';
ParamByName('p2').AsString := Edit2.Text + '%';
ParamByName('p3').AsString := Edit3.Text + '%';
ParamByName('p4').AsString := Edit4.Text + '%';
Open
end;

Buscar un registro por diferentes campos


Necesito buscar un registro dentro de una tabla pero por diferentes campos, os
explico tengo un Form con un DBGrid en el que se van colocando los registros
seleccionados, este Form tiene un Edit en el que tecleo el nombre, la licencia, el DNI
o el cdigo UCI y mediante una consulta filtro los registros que cumplan la condicin
para poder elegir el que corresponda, por ejemplo si tecleo Gmez, me manda en un
For auxiliar todos los registros que empiezan por Gmez, si tecleo 12345678 me
busca primero en el nombre, como no lo encuentra tendra que buscar en el DNI
pero me devuelve la consulta en blanco.
procedure TF_Inscripcions.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
If (Key=#13) then
begin
Bsr:=TBuscar.Create(Application);
Bsr.Close;
Bsr.SQL.Clear;
Bsr.SQL.Add('Select dorsal, nom_llarg, dni, licencia, codiuci, nacio, club, edat,');
Bsr.SQL.Add('abr_club, publicitat, categoria From ctr0003');
Bsr.SQL.Add('Where nom_llarg Starting :nom Or dni Starting :nom');
Bsr.SQL.Add('Or llicencia Starting :nom Or codiuci Starting :nom');
Bsr.SQL.Add('Order By nom_llarg');
Bsr.ParamByName('nom').AsString:=Edit1.Text;
Bsr.Open;
Bsr.Show;
end;
end;
Clculo de horas laborales
Funcin que cuenta las horas laborales entre dos fechas, descontando los das del
fin de semana y los das festivos. Para ello, hay que indicarle la fecha y hora de
inicio y de fin, las horas de comienzo y fin del horario, y hay que tener en una tabla
los festivos (festivos es el nombre de la tabla), para que pueda descontar esos das.
Es til para por ejemplo medir las horas de cualquier servicio.
SET TERM ^;
CREATE OR ALTER PROCEDURE tiempoentrefechas (
fi TimeStamp, ff TimeStamp, hih Time, hfh Time)
RETURNS (tiempo Float)
AS
Declare Variable nfi, nff, wi, wf TimeStamp;
Declare Variable syd, fes, syd Integer;
Declare variable tw, horas, tiempodia1, tiempodia2 Float;
Declare variable taf float, tff Float;

begin
nfi= fi;
nff= ff;
/* Adecuamos la fecha y hora de inicio respecto al fin del horario */
if (Cast(nfi As Time) > hfh) then
nfi= Cast(nfi+1 As Date) + hih;
/* Adecuamos la fecha y hora de inicio respecto al inicio del horario */
if (Cast(nfi As Time) < hih) then
nfi= Cast(nfi As Date) + hih;
/* Adecuamos la fecha y hora de inicio respecto a los fines de semana */
if (Extract(WeekDay From nfi) = 6) then /* Sabados*/
nfi= Cast(nfi+2 As Date)+ hih;
if (Extract(WeekDay From nfi) = 0) then /* Domingos*/
nfi= Cast(nfi+1 As Date)+ hih;
/* Adecuamos la fecha y hora de fin respecto al fin del horario */
if (Cast(nff As Time)> hfh) then
nff= Cast(nff As Date)+hfh;
/* Adecuamos la fecha y hora de fin respecto al inicio del horario */
if ( Cast(nff As Time) < hih) then
nff= Cast(nff-1 As Date)+hfh;
/* Adecuamos la fecha y hora de fin respecto a los fines de semana */
if (Extract(WeekDay From nff) = 6) then /* Sabados */
nff= Cast(nff-1 As Date)+ hfh;
if (Extract(WeekDay From nff) = 0) then /* Domingos*/
nff= Cast(nff-2 As Date)+ hfh;
/* Calculamos los das de fin de semana */
syd =((DatedIff(Day, nfi, nff)+Extract(WeekDay From nfi) )/7) *2;
/* Calculamos todos los das sin fines de semana. Hay que quitarle un da... */
tw = DatedIff( Day, nfi, nff) -1 - syd;
if (tw < 0) then
tw=0;
tff = tw;
-- Das transcurrido * horasDia + horas de primer da + horas del ultimo da
taf = tw * DatedIff( Minute ,hih, hfh) /60.00 +
DatedIff(Minute, Cast(nfi As Time), hfh)/60.00 +
DatedIff(Minute, hih, Cast(nff As Time))/60.00 ;

/* Quitamos los fes sin incluir los das de inicio y fin, que tratamos luego */

Select Count(1) From fes


Where dia Between Cast(:nfi As Date)+1 And Cast(:nff As Date)-1
And Extract(WeekDay From dia) Not In (0,6) Into :fes;
tw= tw - fes;
/* Calculamos el tiempo transcurrido en horas */
if ( DatedIff(Day, nfi, nff) = 0) then -- si es el mismo da
tiempo= DatedIff( Minute, Cast(nfi As Time), Cast(nff As Time)) / 60.00;
else
// Dias transcurridos * horasDia + horas de primer da + horas del ultimo da
tiempo= tw * DatedIff(Minute ,hih, hfh) /60.00 +
DatedIff(Minute, Cast(nfi As Time), hfh)/60.00 +
DatedIff(Minute, hih, Cast(nff As Time))/60.00 ;
-- si el primer da es festivo y no es sbado ni domingo, restamos las horas
fes = 0;
Select Count(1) From fes
Where dia=Cast(:nfi As Date) And Extract(WeekDay From dia)
Not In (0,6) Into :fes;
if (fes =1) then
tiempo=tiempo - DatedIff(Minute, Cast(nfi As Time), hfh)/60.00;
-- si el ultimo da es festivo y no es sbado ni domingo, restamos las horas
fes = 0;
Select Count(1) From fes
Where dia=Cast(:nff As Date)
And Extract(WeekDay From dia) NOT IN (0,6) INTO :fes;
if (fes =1) then
tiempo=tiempo - DatedIff( Minute, hih, Cast(nff As Time))/60.00;
/* Para trazar cuando estoy desarrollando */
horas = (DatedIff(Minute ,hih, hfh))/60.00;
tiempodia1=DatedIff(Minute, Cast(nfi As Time), hfh)/60.00;
tiempodia2=DatedIff(Minute, hih, Cast(nff As Time))/60.00;
wf = nff;
wi= nfi;
syd= syd;
tiempo= tiempo;
if (tiempo < 0 or (tiempo IS NULL)) then
tiempo=0;
suspend;
end^
SET TERM ;^
Grant Select On fes TO PROCEDURE tiempoentrefechas;
Grant EXECUTE ON PROCEDURE tiempoentrefechas TO SYSDBA;

Consulta de 2 tablas y dar resultado en un DBGrid


Estoy utilizando dos tablas: vehculos y bitacoravehiculos, quiero que al realizar la
consulta me muestre algunos campos de ambas tablas en un DBGrid, de esta
manera: para relacionar las dos tablas, utilizo el campo (nave) que existe en ambas
tablas, de la tabla Vehculos, solo quiero nave (que es la llave primaria) y de la tabla
bitacoravehiculos me muestre los campos: fserv, cserv, crep, nfac, dcom, litros,
importe, imptot, para que al ejecutar el formulario de trabajo, al seleccionar un
vehiculo me muestre todo su historial de reparaciones y servicios en un DBGrid, por
ejemplo:
Vehculos
nave Placas
Marca
01
GY01514 Chevrolet
02
GA02133 Nissan
BitacoraVehiculos*
nave FServ
01
26/07/2006
01
28/07/2006
02
20/08/2006

CServ
Importe ImporteTotal
Cambio de llantas $700.00
$700.00
Cambio de balatas $800.00
$1500.00
Cambio de aceite
$100.00
$100.00

Resultado despus de la consulta, si selecciono solo el vehculo 01:


nave FServ
CServ
Importe ImporteTotal
01
26/07/2006
Cambio de llantas $700.00
$700.00
01
28/07/2006
Cambio de balatas $800.00
$1500.00
Resultado despus de la consulta, si selecciono solo el vehculo 02:
nave FServ
CServ
Importe ImporteTotal
02
20/08/2006
Cambio de aceite
$100.00
$100.00
Select v.nave, b.fser, b.cserv, b.crep, b.nfac, b.dcom, b.litros, b.importe, b.imptot
From vehculos v, bitacoraVehiculos b
Where v.nave = b.nave
Order By b.fserv
Adems le cargas todos los campos al Query (doble clic sobre el componente
TQuery, clic derecho sobre la ventana que se abre, y clic en AddAllFields) y si
quieres personalizar el DBGrid1 (Doble clic sobre el DBGrid, creas columnas, y a
stas le seleccionas el nombre del campo en la propiedad DataField).

Agrupar datos de una tabla


La tabla, en la que tengo un ID del recibo y los detalles de los mismos.
CREATE TABLE RE0010DG(
"ID_REBUT" INTEGER NOT NULL,
"ID_ARBIT1" INTEGER,
"ID_ARBIT2" INTEGER,
"ID_ARBIT3" INTEGER,
"ID_ARBIT4" INTEGER,
"ID_ARBIT5" INTEGER,
"ID_ARBIT6" INTEGER,
"ID_ARBIT7" INTEGER,
"ID_ARBIT8" INTEGER,
"KM1" INTEGER,
"KM2" INTEGER,
"KM3" INTEGER,
"KM4" INTEGER,
"KM5" INTEGER,
"KM6" INTEGER,
"KM7" INTEGER,
"KM8" INTEGER,
"SOBRES_1" NUMERIC(9, 2),
"SOBRES_2" NUMERIC(9, 2),
"SOBRES_3" NUMERIC(9, 2),
"SOBRES_4" NUMERIC(9, 2),
"SOBRES_5" NUMERIC(9, 2),
"SOBRES_6" NUMERIC(9, 2),
"SOBRES_7" NUMERIC(9, 2),
"SOBRES_8" NUMERIC(9, 2),
"IMPORT_1" NUMERIC(9, 2),
"IMPORT_2" NUMERIC(9, 2),
"IMPORT_3" NUMERIC(9, 2),
"IMPORT_4" NUMERIC(9, 2),
"IMPORT_5" NUMERIC(9, 2),
"IMPORT_6" NUMERIC(9, 2),
"IMPORT_7" NUMERIC(9, 2),
"IMPORT_8" NUMERIC(9, 2),
"IMPORT_KM_1" NUMERIC(9, 2),
"IMPORT_KM_2" NUMERIC(9, 2),
"IMPORT_KM_3" NUMERIC(9, 2),
"IMPORT_KM_4" NUMERIC(9, 2),
"IMPORT_KM_5" NUMERIC(9, 2),
"IMPORT_KM_6" NUMERIC(9, 2),
"IMPORT_KM_7" NUMERIC(9, 2),
"IMPORT_KM_8" NUMERIC(9, 2),
"CAMPIONAT1" NUMERIC(9, 2),

"CAMPIONAT2" NUMERIC(9, 2),


"CAMPIONAT3" NUMERIC(9, 2),
"CAMPIONAT4" NUMERIC(9, 2),
"CAMPIONAT5" NUMERIC(9, 2),
"CAMPIONAT6" NUMERIC(9, 2),
"CAMPIONAT7" NUMERIC(9, 2),
"CAMPIONAT8" NUMERIC(9, 2),
"FEINER1" NUMERIC(9, 2),
"FEINER2" NUMERIC(9, 2),
"FEINER3" NUMERIC(9, 2),
"FEINER4" NUMERIC(9, 2),
"FEINER5" NUMERIC(9, 2),
"FEINER6" NUMERIC(9, 2),
"FEINER7" NUMERIC(9, 2),
"FEINER8" NUMERIC(9, 2),
"DOS_SECTORS1" NUMERIC(9, 2),
"DOS_SECTORS2" NUMERIC(9, 2),
"DOS_SECTORS3" NUMERIC(9, 2),
"DOS_SECTORS4" NUMERIC(9, 2),
"DOS_SECTORS5" NUMERIC(9, 2),
"DOS_SECTORS6" NUMERIC(9, 2),
"DOS_SECTORS7" NUMERIC(9, 2),
"DOS_SECTORS8" NUMERIC(9, 2),
"TOTAL_A1" NUMERIC(9, 2),
"TOTAL_A2" NUMERIC(9, 2),
"TOTAL_A3" NUMERIC(9, 2),
"TOTAL_A4" NUMERIC(9, 2),
"TOTAL_A5" NUMERIC(9, 2),
"TOTAL_A6" NUMERIC(9, 2),
"TOTAL_A7" NUMERIC(9, 2),
"TOTAL_A8" NUMERIC(9, 2),
"A1" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A2" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A3" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A4" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A5" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A6" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A7" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"A8" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F1" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F2" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F3" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F4" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F5" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F6" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F7" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES,
"F8" VARCHAR(1) CHARACTER SET ISO8859_1 COLLATE ES_ES);

Necesitara poder sacar los datos agrupados por id_arbitre pero el problema es que
el valor de este ID, puede estar en cualquiera de las 8 columnas posibles.
Vamos que lo que necesitara es poder sacar todos los registros donde aparezca por
ejemplo el valor del rbitro 1, algo as: y sucesivamente, para sacar una hoja por
cada rbitro.
Arbitro 1
Recibo 1
Recibo 3
Recibo 5

Arbitro 2
Recibo 1
Recibo 2
Recibo 3

El problema que tengo y que no s cmo solventar es que el valor del id_arbitre = 1
puede estar tanto en id_arbitre_1, id_arbitre_2, id_arbitre_3, id_arbitre_4,
ID_arbitre_5, id_arbitre_6, id_arbitre_7, id_arbitre_8, pero solo una vez en cada
recibo. Luego todos los campos adicionales son los que tienen el mismo numero
id_arbitre_1 -> km_1 -> total_1, etc.
Select id_arbit1, id_rebut, import_1, sobres_1,
dos_sectors1, total_a1 From re0010dg
Where id_arbit1 = 1
UNION
Select id_arbit2, id_rebut, import_2, sobres_2,
dos_sectors2, total_a2 From re0010dg
Where id_arbit2 = 1
UNION
Select id_arbit3, id_rebut, import_3, sobres_3,
dos_sectors3, total_a3 From re0010dg
Where id_arbit3 = 1
UNION
Select id_arbit4, id_rebut, import_4, sobres_4,
dos_sectors4, total_a4 From re0010dg
Where id_arbit4 = 1
UNION
Select id_arbit5, id_rebut, import_5, sobres_5,
dos_sectors5, total_a5 From re0010dg
Where id_arbit5 = 1
UNION
Select id_arbit6, id_rebut, import_6, sobres_6,
dos_sectors6, total_a6 From re0010dg
Where id_arbit6 = 1
UNION
Select id_arbit7, id_rebut, import_7, sobres_7,
dos_sectors7, total_a7 From re0010dg
Where id_arbit7 = 1
UNION

import_km_1, campionat1, feiner1,

import_km_2, campionat2, feiner2,

import_km_3, campionat3, feiner3,

import_km_4, campionat4, feiner4,

import_km_5, campionat5, feiner5,

import_km_6, campionat6, feiner6,

import_km_7, campionat7, feiner7,

Select id_arbit8, id_rebut, import_8, sobres_8, import_km_8, campionat8, feiner8,


dos_sectors8, total_a8 From re0010dg
Where id_arbit8 = 1
Asignando sentencias SQL para modificar en IBDataSet
var
filtro: String;
begin
Case AnsiIndexStr(equipo ,['rojo', 'verde']) of
0: filtro := 'juego_zona_uno=:juego_zona_uno,';
1: filtro := 'juego_zona_dos=:juego_zona_dos,';
else begin
ShowMessage('Equipo no inscrito');
exit;
end;
end;
ibdtst.ModifySQL.Clear;
ibdtst.ModifySQL.Add('Update torneo SET,');
ibdtst.ModifySQL.Add('clave=:clave,');
ibdtst.ModifySQL.Add(filtro);
ibdtst.ModifySQL.Add('WHERE clave=clave,');
end;
Actualizar un campo vaco con el valor de otro
El archivo TXT en el que me mandan los corredores ciclistas desde la federacin,
est separado por comas y su formato es dorsal, nombre, apellido1, apellido2, etc.,
esto hasta aqu es correcto, luego yo importo estos datos a la tabla Firebird
correspondiente y funciona, pero los corredores extranjeros que tienen un solo
apellido, no figura en apellido1 sino en apellido 2, si hago una bsqueda a estos no
los encuentro jams ya que el valor es vaco, como ejemplo:
1
2
3
4

Josep
Lio
Johnny
Antonio

Fernndez
Chin
Walker
Gmez

Albert

Prez

etc.
etc.
etc.
etc.

Lo que yo necesitara sera que una vez importados los datos a la tabla, pudiera
recorrer la tabla y cambiar el valor de los registros 2 y 3 (que son los que estn
vacos en apellido1) y que la tabla quedara as:
1
2
3
4

Josep
Lio
Johnny
Antonio

Fernndez
Chin
Walker
Gmez

Albert

Prez

etc.
etc.
etc.
etc.

Actualizacin:
Update corredores Set apellido1=apellido2, apellido2='' Where apellido1 Is Null
Bsqueda:
Select * From corredores Where apellido1 Like '%ernandez%' Or apellido2 Like
'%ernandez%'
Editar Informacin de DBEdit y tambin en DBGrid
Tengo una pequea tabla de prctica, creada de la siguiente manera.
CREATE TABLE USUARIO (
CODIGO CHAR(12) NOT NULL,
NOMBRE CHAR(30),
APELLIDO CHAR(30),
CIUDAD CHAR(20),
TELEFONO CHAR(12)
);
Luego hicimos las conexiones a una forma, usando IBX, como se necesita, usando
un TIBDataSet y unos DBEdit, conectamos la base de datos y un DBGrid usando un
DataSource.
Usando un IBQuery, hacemos una bsqueda en la tabla para buscar la informacin
que ha sido digitada en el DBEdit. Cuando la informacin se encuentra en la tabla
esta se debe poder Editar, y adicionalmente debo poder ver la informacin en el
DBGrid.
Como la informacin me la entrega un IBQuery, esta solo se puede mirar, pero no se
puede entrar a editar en los otros DBEdit, debido a que los DBEdit no estn mirando
la tabla, sino la informacin del IBQuery, y mucho menos apuntando en el DBGrid.
Creo que te va a resultar ms simple utilizar el evento OnSetText del TField en
cuestin:
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure CampoSetText(Sender: TField; const Text: String);
public
end;
implementation
procedure TForm1.FormCreate(Sender: TObject);

begin
IBDataSet1.FieldByName('CAMPO_BUSQUEDA').OnSetText:= CampoSetText;
end;
procedure TForm1.CampoSetText(Sender: TField; const Text: String);
begin
if not IBDataSet1.Locate('CAMPO_BUSQUEDA', Text, []) then
Abort;
end;
En el ejemplo asigno el evento en tiempo de ejecucin; pero si tienes creados los
campos persistentes lo podes hacer en diseo desde el Object Inspector.
Consulta para insertar campo en una tabla si no existe
Buscando la manera de insertar un campo en una tabla pero verificando que ste no
existiera previamente a travs de un SP:
CREATE OR ALTER PROCEDURE InsertarCampo
AS
begin
if (Not Exists(select 1 From RDB$Relation_Fields
Where RDB$Relation_Name = 'tabla' And RDB$Field_Name = 'CAMPO')) then
Execute Statement 'Alter Table tabla Add campo Integer';
end;
Problemas con Update
Tengo dos tablas, clientes y repartidores, y necesito hacer un Update en un campo
de la tabla clientes cuando se cumpla la condicin clientes.cod = repartidores.cod.
El problema viene cuando quiero darle el valor a pelo, no el de un campo de la tabla,
sino hara un Select sobre el campo y le dara el valor.
CREATE TABLE "CLIENTES" (
COD VARCHAR(20) NOT NULL,
TRC CHAR(1) NOT NULL
);
CREATE TABLE "REPARTIDORES" (
COD VARCHAR(20) NOT NULL
);
Update clientes c Set c.trc = 's' Where c.cod In (Select "cod" From repartidores)

Relaciones uno a muchos en Firebird


Dispondremos del programa SQL manager lite for InterBase and Firebird.
Una vez dentro del programa, tendremos por lo menos dos
seleccionaremos la tabla que tendr la relacin muchos.

tablas,

En la zona derecha del programa seleccionamos la ficha "Constraints" y dentro de


esta ficha seleccionamos la ficha "Foreign Keys".

Seleccionaremos el campo que vamos a relacionar con la tabla fornea,


"CONCEPTO", en el campo "Foreign Table" seleccionamos la tabla
"CONCEPTO", dentro de sta tabla seleccionamos el campo clave primaria "ID".

Finalizaos pulsando sobre el botn "Ok" y despus sobre el botn "Compile".

Вам также может понравиться

  • Manual de Instalacion de DBIsam VCL 4.40
    Manual de Instalacion de DBIsam VCL 4.40
    Документ8 страниц
    Manual de Instalacion de DBIsam VCL 4.40
    Juan Carlos Carta
    Оценок пока нет
  • Fase3 Grupo 18
    Fase3 Grupo 18
    Документ25 страниц
    Fase3 Grupo 18
    Julian Villamizar
    Оценок пока нет
  • Tema 3
    Tema 3
    Документ13 страниц
    Tema 3
    Mql
    Оценок пока нет
  • Informe Acerca de Los Trigger
    Informe Acerca de Los Trigger
    Документ6 страниц
    Informe Acerca de Los Trigger
    wagner
    Оценок пока нет
  • Turbo Pascal
    Turbo Pascal
    Документ13 страниц
    Turbo Pascal
    marijo1990
    100% (2)
  • Curso Pascal
    Curso Pascal
    Документ67 страниц
    Curso Pascal
    Grego Dadone
    Оценок пока нет
  • Delphi PDF
    Delphi PDF
    Документ49 страниц
    Delphi PDF
    Carlos Martinez Juarez
    Оценок пока нет
  • ASP
    ASP
    Документ62 страницы
    ASP
    Alberto Barrera III
    Оценок пока нет
  • Manual Assembler
    Manual Assembler
    Документ83 страницы
    Manual Assembler
    Jhon Cocha Araucano
    Оценок пока нет
  • Guia Python
    Guia Python
    Документ142 страницы
    Guia Python
    José Campos
    Оценок пока нет
  • Curso Basico de Delphi
    Curso Basico de Delphi
    Документ61 страница
    Curso Basico de Delphi
    Steven Reyes
    Оценок пока нет
  • Fundamentos de Delphi
    Fundamentos de Delphi
    Документ29 страниц
    Fundamentos de Delphi
    SALVAMEXTAB
    Оценок пока нет
  • File Upload
    File Upload
    Документ7 страниц
    File Upload
    jsancaconecta2
    Оценок пока нет
  • Manual de Assembler
    Manual de Assembler
    Документ25 страниц
    Manual de Assembler
    Almendra Yarasca
    Оценок пока нет
  • Delphi 6
    Delphi 6
    Документ57 страниц
    Delphi 6
    Deyvi Rodriguez
    Оценок пока нет
  • Sesión 06 - Windows Forms
    Sesión 06 - Windows Forms
    Документ18 страниц
    Sesión 06 - Windows Forms
    eriveraa
    100% (7)
  • Estructura de Un Programa C++
    Estructura de Un Programa C++
    Документ7 страниц
    Estructura de Un Programa C++
    JohnnyElles
    Оценок пока нет
  • Excel
    Excel
    Документ21 страница
    Excel
    Paula Gallego G
    Оценок пока нет
  • Ejercicios en Java para Desarrollar Tu Mente
    Ejercicios en Java para Desarrollar Tu Mente
    Документ21 страница
    Ejercicios en Java para Desarrollar Tu Mente
    anon_247741758
    Оценок пока нет
  • Tutorial Java Eclipse para Novatos Spanish
    Tutorial Java Eclipse para Novatos Spanish
    Документ40 страниц
    Tutorial Java Eclipse para Novatos Spanish
    Luis Robles
    Оценок пока нет
  • ASP - Curso Esi
    ASP - Curso Esi
    Документ47 страниц
    ASP - Curso Esi
    Alejandro Cerezo Lasne
    Оценок пока нет
  • Curso Pascal
    Curso Pascal
    Документ109 страниц
    Curso Pascal
    drakeyahoocom
    Оценок пока нет
  • Excel
    Excel
    Документ21 страница
    Excel
    Marycela Osorio
    Оценок пока нет
  • Curso de Batch Desde 0 Por Juanla
    Curso de Batch Desde 0 Por Juanla
    Документ26 страниц
    Curso de Batch Desde 0 Por Juanla
    urielmoka
    Оценок пока нет
  • Delphi Eventos
    Delphi Eventos
    Документ4 страницы
    Delphi Eventos
    Aquino
    100% (1)
  • Ejercicios Consola C#
    Ejercicios Consola C#
    Документ30 страниц
    Ejercicios Consola C#
    Sebastian Martinez
    Оценок пока нет
  • 2a Evaluacion ExamenBootStrap
    2a Evaluacion ExamenBootStrap
    Документ4 страницы
    2a Evaluacion ExamenBootStrap
    JesúsRodríguezVargas
    Оценок пока нет
  • Manual de Pascal
    Manual de Pascal
    Документ176 страниц
    Manual de Pascal
    Lui Gui
    Оценок пока нет
  • Assembler
    Assembler
    Документ26 страниц
    Assembler
    Danny Grovers
    Оценок пока нет
  • Borrar Pantalla Devc++
    Borrar Pantalla Devc++
    Документ1 страница
    Borrar Pantalla Devc++
    Kiuk Garcia
    100% (2)
  • Tablas Temporales
    Tablas Temporales
    Документ15 страниц
    Tablas Temporales
    Jose Maria Arrabal Alcañiz
    100% (1)
  • Lenguaje C
    Lenguaje C
    Документ42 страницы
    Lenguaje C
    Laureano de Priego
    Оценок пока нет
  • Base de Datos - Apendices
    Base de Datos - Apendices
    Документ34 страницы
    Base de Datos - Apendices
    Aldo Vilches Godoy
    Оценок пока нет
  • Excel
    Excel
    Документ37 страниц
    Excel
    Davit Jhonatan Calderon Congora
    Оценок пока нет
  • Expresiones Lambda (Guía de Programación de C#) PDF
    Expresiones Lambda (Guía de Programación de C#) PDF
    Документ10 страниц
    Expresiones Lambda (Guía de Programación de C#) PDF
    Luis
    Оценок пока нет
  • Guia 9 PDF
    Guia 9 PDF
    Документ9 страниц
    Guia 9 PDF
    Hatun Aytug
    Оценок пока нет
  • Delphi
    Delphi
    Документ45 страниц
    Delphi
    Wilson Palomo
    Оценок пока нет
  • Operadores de Logica - 01
    Operadores de Logica - 01
    Документ76 страниц
    Operadores de Logica - 01
    Juan Gonzalez Saucedo
    Оценок пока нет
  • Control Listbox
    Control Listbox
    Документ14 страниц
    Control Listbox
    Moises Armando Gonzalez Tejada
    Оценок пока нет
  • Capitulo 9 Visual Basic
    Capitulo 9 Visual Basic
    Документ24 страницы
    Capitulo 9 Visual Basic
    boyforbaby
    100% (11)
  • Desarrolla Con Oracle y Power Builder 10
    Desarrolla Con Oracle y Power Builder 10
    Документ9 страниц
    Desarrolla Con Oracle y Power Builder 10
    Gilmer Vásquez Pérez
    Оценок пока нет
  • Curso de Visual FoxPro PDF
    Curso de Visual FoxPro PDF
    Документ65 страниц
    Curso de Visual FoxPro PDF
    Ariel Gomez
    Оценок пока нет
  • Algoritmo Diapositivas, Presentacion
    Algoritmo Diapositivas, Presentacion
    Документ16 страниц
    Algoritmo Diapositivas, Presentacion
    Anne Garcia
    Оценок пока нет
  • Visual Basic
    Visual Basic
    Документ20 страниц
    Visual Basic
    Hernando Delgado Villegas
    Оценок пока нет
  • Entrega3 - Capitulo IV y Captilo V
    Entrega3 - Capitulo IV y Captilo V
    Документ38 страниц
    Entrega3 - Capitulo IV y Captilo V
    Sergio Sanchez
    Оценок пока нет
  • Manual Power Builder
    Manual Power Builder
    Документ84 страницы
    Manual Power Builder
    Hassan Abdella
    100% (1)
  • Visual Basic
    Visual Basic
    Документ143 страницы
    Visual Basic
    Mario Villalba Gonzaga
    Оценок пока нет
  • Lenguaje Batch Tutorial y Comandos Básicos .
    Lenguaje Batch Tutorial y Comandos Básicos .
    Документ15 страниц
    Lenguaje Batch Tutorial y Comandos Básicos .
    pepe garcia
    Оценок пока нет
  • Html5 Nodejs Mysql
    Html5 Nodejs Mysql
    Документ9 страниц
    Html5 Nodejs Mysql
    alejandro piamba
    Оценок пока нет
  • Powershell Scripting Powershell 7.3
    Powershell Scripting Powershell 7.3
    Документ3 560 страниц
    Powershell Scripting Powershell 7.3
    Luis Enrique Flores Canchumanya
    Оценок пока нет
  • Creand Base de Datos - Tabla
    Creand Base de Datos - Tabla
    Документ80 страниц
    Creand Base de Datos - Tabla
    Maravi AP
    Оценок пока нет
  • Imprimir Inner Join PDF
    Imprimir Inner Join PDF
    Документ5 страниц
    Imprimir Inner Join PDF
    Casana Uap
    Оценок пока нет
  • Ejercicios de Excel Desarrollado y Propuesto
    Ejercicios de Excel Desarrollado y Propuesto
    Документ17 страниц
    Ejercicios de Excel Desarrollado y Propuesto
    Marco Antonio Rodríguez Solórzano
    Оценок пока нет
  • Tutorial Power Cobol
    Tutorial Power Cobol
    Документ15 страниц
    Tutorial Power Cobol
    Francisco Junior
    Оценок пока нет
  • Creacion Clases Vb6
    Creacion Clases Vb6
    Документ71 страница
    Creacion Clases Vb6
    Heinz Gomez
    Оценок пока нет
  • Guardar Archivos Binarios en SQL Server - Developers - Null PDF
    Guardar Archivos Binarios en SQL Server - Developers - Null PDF
    Документ7 страниц
    Guardar Archivos Binarios en SQL Server - Developers - Null PDF
    jam8515
    Оценок пока нет
  • LISP. Tutorial en Español
    LISP. Tutorial en Español
    Документ21 страница
    LISP. Tutorial en Español
    Numa Eduardo Tortolero
    Оценок пока нет
  • ReportViewer y RDLC
    ReportViewer y RDLC
    Документ34 страницы
    ReportViewer y RDLC
    Wilber Quispe
    Оценок пока нет
  • ReportViewer y RDLC
    ReportViewer y RDLC
    Документ25 страниц
    ReportViewer y RDLC
    Robert Vargas Bonilla
    Оценок пока нет
  • Libro de C#-Hyron R
    Libro de C#-Hyron R
    Документ157 страниц
    Libro de C#-Hyron R
    Hyron Ramires
    Оценок пока нет
  • Nota Técnica 2
    Nota Técnica 2
    Документ8 страниц
    Nota Técnica 2
    René Zapata
    Оценок пока нет
  • Informe Del Proyecto Asm
    Informe Del Proyecto Asm
    Документ6 страниц
    Informe Del Proyecto Asm
    Mauro Sebastian Volpe Paredes
    Оценок пока нет
  • Creación de Un Sistema de Almacén Con C#
    Creación de Un Sistema de Almacén Con C#
    Документ57 страниц
    Creación de Un Sistema de Almacén Con C#
    florapatricia
    100% (1)
  • Actividad 4 - Segunda Parte Caso Practico
    Actividad 4 - Segunda Parte Caso Practico
    Документ12 страниц
    Actividad 4 - Segunda Parte Caso Practico
    josue roa pinzon
    Оценок пока нет
  • Actividad de Aprendizaje 3
    Actividad de Aprendizaje 3
    Документ36 страниц
    Actividad de Aprendizaje 3
    Felipe Andres Morales Arango
    Оценок пока нет
  • Actividad Macros
    Actividad Macros
    Документ11 страниц
    Actividad Macros
    Miguel Angel Seclen Medina
    Оценок пока нет
  • Cuadro Comparativo
    Cuadro Comparativo
    Документ1 страница
    Cuadro Comparativo
    Carlos QR
    Оценок пока нет
  • Mongo
    Mongo
    Документ17 страниц
    Mongo
    Estefanny
    Оценок пока нет
  • Bases II - Proyectos 2020-06-15
    Bases II - Proyectos 2020-06-15
    Документ43 страницы
    Bases II - Proyectos 2020-06-15
    Jhosua Fuertes Melendez
    Оценок пока нет
  • EXPOSICION DE SENTENCIAaaaassss
    EXPOSICION DE SENTENCIAaaaassss
    Документ8 страниц
    EXPOSICION DE SENTENCIAaaaassss
    Dannydejess
    Оценок пока нет
  • El Lenguaje SQL
    El Lenguaje SQL
    Документ25 страниц
    El Lenguaje SQL
    david castro
    Оценок пока нет
  • Díaz Jenifer Modelo Relacional
    Díaz Jenifer Modelo Relacional
    Документ6 страниц
    Díaz Jenifer Modelo Relacional
    Jeni Mtez
    Оценок пока нет
  • BD de Consultorio Dental
    BD de Consultorio Dental
    Документ9 страниц
    BD de Consultorio Dental
    diazvejaranodiegodarwin
    Оценок пока нет
  • Examen Parcial Final Base de Datos - 63 de 70
    Examen Parcial Final Base de Datos - 63 de 70
    Документ12 страниц
    Examen Parcial Final Base de Datos - 63 de 70
    angie lozano
    Оценок пока нет
  • Cuadernillo - Laboratorio - BDRelacionales 4 Pric
    Cuadernillo - Laboratorio - BDRelacionales 4 Pric
    Документ10 страниц
    Cuadernillo - Laboratorio - BDRelacionales 4 Pric
    Erick De Santos
    Оценок пока нет
  • Act.3.1 Investigación AdrianaAguilar
    Act.3.1 Investigación AdrianaAguilar
    Документ8 страниц
    Act.3.1 Investigación AdrianaAguilar
    20690024 ADRIANA AGUILAR MARTINEZ
    Оценок пока нет
  • Dabd U3 A3
    Dabd U3 A3
    Документ9 страниц
    Dabd U3 A3
    Luisa Sustaita
    Оценок пока нет
  • Bases de Datos Con PHP y Mysql
    Bases de Datos Con PHP y Mysql
    Документ18 страниц
    Bases de Datos Con PHP y Mysql
    YoliNavarrete
    Оценок пока нет
  • Entrega Practica MySQL
    Entrega Practica MySQL
    Документ22 страницы
    Entrega Practica MySQL
    CLAUDIA JULIANA DULCEY SANCHEZ
    Оценок пока нет
  • FoxPro - 01 - El Entorno de Desarrollo de Visual FoxPro
    FoxPro - 01 - El Entorno de Desarrollo de Visual FoxPro
    Документ43 страницы
    FoxPro - 01 - El Entorno de Desarrollo de Visual FoxPro
    amtzva@
    Оценок пока нет
  • Microsoft Access
    Microsoft Access
    Документ70 страниц
    Microsoft Access
    Alexi Anchundia
    Оценок пока нет
  • Trigger
    Trigger
    Документ5 страниц
    Trigger
    JOVANI DAVID HIDALGO MELO
    Оценок пока нет
  • Ut3 Er
    Ut3 Er
    Документ84 страницы
    Ut3 Er
    Dionisio
    Оценок пока нет
  • Tutorial Desde 0 SQL Server 2005 PDF
    Tutorial Desde 0 SQL Server 2005 PDF
    Документ8 страниц
    Tutorial Desde 0 SQL Server 2005 PDF
    Dorian Yraipi
    Оценок пока нет
  • Copia de CLASE 2
    Copia de CLASE 2
    Документ16 страниц
    Copia de CLASE 2
    EmericKill95
    Оценок пока нет
  • Sumario Consultas Final Curso
    Sumario Consultas Final Curso
    Документ35 страниц
    Sumario Consultas Final Curso
    crossfireinlinux
    Оценок пока нет
  • Cubos OLAP
    Cubos OLAP
    Документ8 страниц
    Cubos OLAP
    Jvlio Cesar Calleja Moreno
    Оценок пока нет
  • SESION 02 SQL
    SESION 02 SQL
    Документ40 страниц
    SESION 02 SQL
    Jorge Rodolfo Vasquez Espinoza
    Оценок пока нет
  • Vistas y Precedimientos Almacenados
    Vistas y Precedimientos Almacenados
    Документ14 страниц
    Vistas y Precedimientos Almacenados
    Yeison Stiven Linares Guacaneme
    Оценок пока нет
  • Practica 11 PL/SQL
    Practica 11 PL/SQL
    Документ8 страниц
    Practica 11 PL/SQL
    Elias Martí
    Оценок пока нет