PDA

Ver la Versión Completa : Pasar consulta de FireBird a MS SQL server 2000


sakuragi
29-08-2005, 18:29:53
hola que tal

encontre una funcion por aqui e los foros

pero viene en fireBird

no eh podido pasar una sentencia a ms sql.

este el codigo en FIREBIRD


select codemp,nombre,apellidos
from empleados
where (rtrim(nombre) ||'' ''|| rtrim(apellidos)) containing :data


:date es de

parambyname('data'+inttostr(n)).asstring:=cadena[n];

esto lo saque de la una consulta que se parese al winamp.

"containing" esta funcion de firebird no se como haser en MS sql para que funcione igual

bueno les pongo el codigo de toda la consulta tipo winamp hecha por vtdeleon (member.php?u=2723)


procedure Tfrmbuscar.FormCreate(Sender: TObject);
begin
vbusca.Clear;//Edit
Codigo:='';//DECLARADA PRIVATE
cadena:=TStringList.Create;//DECLARADA PRIVATE
Query1.Close;
with Query1.SQL do begin
Clear;
Add('select Codemp, Nombre, apellidos');//+column );
Add('from empleados');//+tabla);
end;
Query1.Open;
end;

procedure Tfrmbuscar.vbuscaKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
n:integer;
begin
if (Length(trim(vbusca.Text))>0) then
if key in [VkKeyScanA('A')..VkKeyScan('Z'), VkKeyScanA('0')..VkKeyScan('9'),
VK_BACK, vk_space, vk_delete] then begin
cadena.CommaText:=vbusca.Text;
with Query1 do begin
Close;
if cadena.Count<>nkey then begin
condi:=' (rtrim(nombre) ||'' ''|| rtrim(apellidos)) containing :data'+'0';
for n:= 1 to cadena.Count-1 do begin
condi:=condi +' and (rtrim(nombre) ||'' ''|| rtrim(apellidos)) containing :data'+inttostr(n);
end;
if SQL.Count>2 then
sql.Delete(2);
sql.Insert(2,'where '+condi);
end;
for n:=0 to ParamCount-1 do begin
ParamByName('data'+inttostr(n)).AsString:=cadena[n];
end;
nkey:=n;
if not Prepared then
Prepare;
Open;
end;

end;{ else key:= #0;}
end;


ya le he estado intentando hasrlo funcionar con ms sql pero me ha sido en bano

eh modificado mucho pero creo que el principal problem esta en

condi:=' (rtrim(nombre) ||'' ''|| rtrim(apellidos)) containing :data'+'0'

si me equivoco espero me corrijan

lo e puesto asi

condi:=' (rtrim(nombre)+'' ''+rtrim(apellidos));


me marca erro de parentecis =S

cual quier ayuda sera muy bien agradecida

gracias

saludos

ContraVeneno
29-08-2005, 21:05:07
No he podido probar el código SQL, pero creo que || se cambia por | y containing por having. Es decir:

select codemp,nombre,apellidos
from empleados
Having (trim(nombre) | trim(apellidos)) :data

Esto no lo he podido comprobar, solo espero que al menos te de una idea (y si mi idea es totalmente errónea, pues tambien sáquenme de mi ignorancia :D )

Con respecto a tu cambio, creo que sería:

condi:=' (rtrim(nombre) + '' '' + rtrim(apellidos)) ';

sakuragi
29-08-2005, 23:18:13
muchas gracias contraveneno

lo probare

saludos

depues te digo como me fue

sakuragi
30-08-2005, 00:29:30
nop no corrio

dice que no es .

tambien probe con "contains"

y tampoco.

marca erro "objeto parameter mal definido"

=S

creo que hando mas perdido que un machihui de 15 dias

probe asi


condi:='having (rtrim(nombre)+'' ''+ rtrim(apellidos)):data'+'0';

y tambien


condi:=' (rtrim(nombre) +'' ''+ rtrim(apellidos))having :data'+'0';


condi:='having (rtrim(nombre) | rtrim(apellidos)):data'+'0';

y varias mas formas =S


se supones el sql deve ser igual donde sea ¬¬

=P

saludos

vtdeleon
30-08-2005, 01:56:51
Saludos

condi:='(rtrim(nombre) | rtrim(apellidos)) like '+ QuoteStr('%'+Vardata[n]+'%') ;
En lugar de utilizar el parametro data, la cual la utilice como un arreglo para el proposito. Puedes declara un variable String (VarData:array of string).
Pues con el || no estoy seguro como se debe utilizar en MSSQL pero intenta con '&'

sakuragi
30-08-2005, 19:12:01
gracias por responder otraves.

ahiva mas o menos

el problem que tengo ahora

es de pasar el texto del edit

a la variabe

vardata

ya que con cadena.commatext:=edit.text;

pasar el texto a la variable cadena y si ahi un espacio los separa por item como en una lista

el probla que teno esl como pasar eso al "vardata" para comparar esos token con [n]

eh intengo asi:

vardata:=cadena.text;

vardata:=cadena[n];

vardata:=cadena.commatext;



creo que para aseder a esalista que se genera separando es (x,y) para pasarse para abajo

por que pongo cadena[n] pero nomas cuando es "1" me da el valor ya cuando es "2" no me lo da, entonses crewo que deve ser "2,1"

=S


saludos
saludos

sakuragi
30-08-2005, 19:35:10
bueno ya resolvi ese pequeño problemita

puse a recompilar el cerebro

y salio que


cadena.strings[n];


me daba lo que estaba buscado

saludos

:cool:

ContraVeneno
30-08-2005, 20:02:02
Que bueno que ya se resolvió. La siguiente tarea será escribir un mensaje sin errores de ortografía. :D :D
Lo digo con todo respeto.
Saludos.

sakuragi
30-08-2005, 20:51:09
buen punto

creo que mi compilador handa fallando en ese aspecto
:D