Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-11-2018
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Concatenación de campos BLOB

Buenas, estoy trabajando con Firebird 3.0, Delphi XE5, FireDac.
Necesito concatenar dos campos BLOB, lo que hago es lo siguiente:

Código SQL [-]
Select a.titulo_aviso_admin || a.cuerpo_aviso_admin AS titulo_aviso
From sumario_Admin s 
-- ...

Pero cuando ejecuto, solamente me devuelve lo que está en a.titulo_aviso_admin, sin concatenación con la segunda parte.
Aclaro que, lo que hay en los campos está en formato RTF, pero al menos debería mostrarme que los junta, o un error. Sin embargo, lo hace pero no concatena.
Bueno, espero haber sido claro.
Ojalá puedan ayudarme.

Gracias.
Santiago.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #2  
Antiguo 27-11-2018
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.408
Poder: 22
fjcg02 Va camino a la fama
Hola,
aunque no tengo ninguna certeza, supongo que los tiros van por la concatenación.

Al concatenar, el segundo blob tiene la cadena de comienzo de fichero. Supongo que por eso se te china.

Quítale un cacho de x caracteres al principio del segundo blob, concatena y prueba.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #3  
Antiguo 28-11-2018
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.020
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si los campos son blob binario (subtipo 0) no podrás, tendrás que extraerlos.
Pero si los campos son blob de texto (subtipo 1) sí que podrás concatenarlos normalmente con ||

Responder Con Cita
  #4  
Antiguo 28-11-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Tratándose de la versión 3 de Firebird no me aventuro a asegurarlo por que desconozco sus cambios, pero la versión 2.5 se comporta de igual modo.

Leyendo en The Firebird Book de Helen Borrie encontré :
Cita:
Operations on BLOBs

A BLOB is never updated. Every update that “changes” a BLOB causes a new BLOB to
be constructed, complete with a new BLOB ID. The original BLOB becomes obsolete
once the update is committed.

A BLOB column can be tested for NULL/NOT NULL, but no internal function
exists to compare one BLOB with another or to compare a BLOB to a string. Several
BLOB UDFs are available from community download sites, including some that compare
two BLOBs for equality.

It is not possible to concatenate two BLOBs or to concatenate a string to a BLOB.
...
(Cap. 12 - pg. 184)
También encontré mención a esto en otros enlaces como por ejemplo en: BLOB Types Firebird

Intentando otro camino, no sería mayor problema hacerlo desde Delphi mediante Streams si no se tratase de contenido con formato RTF. Pero, lamentablemente ese formato posee cabecera, finalizacion, etc. y no se puede concatenar como si se tratase de texto o contenido binario.

Finalmente, como te comenta Antonio usando SUB_TYPE 1 sí que Firebird lo puede hacer sin problemas, pero estarías trabajando con texto sin formato.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 28-11-2018
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Wink

Entiendo.
Tienen razón, no hay manera de concatenar si son RTF. Hay que extraerlos y hacerlo con Stream's.
Ya estoy en eso.

Pongo a consideración unos pequeños procedimientos que hacen eso. Espero sirva. Los hice en DelphiXE5.

Código Delphi [-]
{-------------------------------------------------------------------------------
  Procedure: RichEditToPlainText
  Author:    santiago
  DateTime:  2018.11.27
  Arguments: RichEdit:TRichEdit
  Result:    string
  Comments: Tomamos un RichEdit y lo ponemos en texto plano.
-------------------------------------------------------------------------------}
function RichEditToPlainText(RichEdit:TRichEdit):string; overload;
var
  Stream:TStream;
  ed: TRichEdit;
begin
  ed:=TRichEdit.CreateParented(HWND_MESSAGE);
  Stream:=TStream.Create;
  ed.PlainText:=True;
  RichEdit.Lines.SaveToStream(Stream);
  ed.Lines.LoadFromStream(Stream);
  Result:=Trim(ed.Lines.Text);
  ed.Free;
  Stream.Free;
end;

function RichEditToPlainText(Stream:TStream):string; overload;
var
  ed: TRichEdit;
begin
  ed:=TRichEdit.CreateParented(HWND_MESSAGE);
  ed.PlainText:=True;
  ed.Lines.LoadFromStream(Stream);
  Result:=Trim(ed.Lines.Text);
  ed.Free;
end;

Muchas gracias.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #6  
Antiguo 28-11-2018
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Para que se entienda, esto los pone a todos en Texto Plano. Luego, podemos hacer con ellos lo que nos plazca.

Santiago.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #7  
Antiguo 28-11-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Como comentaste que necesitabas concatenar dos campos Blob, te pongo una alternativa que prescinde del uso de TRichEdit para la conversión:

Código Delphi [-]
function ConcatBlob(Field1, Field2: TField): string;
var
  s1, s2: TStringStream;
  a, b: string;
begin
  // Field1
  s1 := TStringStream.Create('');
  try
    TBlobField(Field1).SaveToStream(s1);
    a := s1.DataString;
    SetLength(a, Length(a)-SizeOf(DWORD));
  finally
    s1.Free;
  end;

  // Field2
  s2 := TStringStream.Create('');
  try
    TBlobField(Field2).SaveToStream(s2);
    b := s2.DataString;
  finally
    s2.Free;
  end;
  Result := a + b;
end;

Ejemplo de uso:
Código Delphi [-]
procedure TForm1.btConcatClick(Sender: TObject);
var
  cad: string;
begin
  cad := ConcatBlob(DataSet.FieldByName('BLOB_1'), DataSet.FieldByName('BLOB_2'));
  RichEdit3.Text := cad;
end;

Resultado:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 28-11-2018
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Uuuuuh. Me parece genial.
Lo voy a probar y veo como queda. Pero creo que es el camino.
Gracias.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
TClienDataSet Problemas con Campos Blob y Campos Calculados LEVV Conexión con bases de datos 2 11-05-2012 02:25:43
Campos Blob L3st4t Debates 2 25-03-2011 22:55:26
Campos BLOB TJose Firebird e Interbase 4 28-12-2006 19:48:20
Campos Blob Huer Varios 1 11-06-2003 11:39:06
Campos Blob Kafu Firebird e Interbase 2 08-05-2003 19:07:54


La franja horaria es GMT +2. Ahora son las 11:07:29.


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