Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Insertar información de Memo en Tabla de BD (https://www.clubdelphi.com/foros/showthread.php?t=81105)

radenf 11-10-2012 01:34:26

Insertar información de Memo en Tabla de BD
 
Hola amigos:

Tengo el siguiente problema.
Desde un servidor mi programa recibe datos en un Memo (esto no lo puedo cambiar) en el siguiente formato:

0 : 57[0008:0005](SpecificCharacterSet)CS=<1>ISO_IR 100
0 : 64[0008:0020](StudyDate)DA=<1>13-09-2009
0 : 77[0008:0050](AccessionNumber)SH=<0>NULL
0 : 78[0008:0052](QueryRetrieveLevel)CS=<1>STUDY
0 : 79[0008:0054](RetrieveAETitle)AE=<1>iMacIV
0 : 81[0008:0060](Modality)CS=<0>NULL
0 : 82[0008:0061](ModalitiesInStudy)CS=<1>CT
0 : 95[0008:1030](StudyDescription)LO=<1>ABD PEL
0 : 147[0010:0010](PatientName)PN=<1>Juan Serrano
0 : 148[0010:0020](PatientID)LO=<1>47310
0 : 425[0020:000D](StudyInstanceUID)UI=<1>1.2.840.113619.2.55.3.101357413.805.1252843607.766
0 : 427[0020:0010](StudyID)SH=<1>44901

1 : 57[0008:0005](SpecificCharacterSet)CS=<1>ISO_IR 100
1 : 64[0008:0020](StudyDate)DA=<1>25-08-2009
1 : 77[0008:0050](AccessionNumber)SH=<0>NULL
1 : 78[0008:0052](QueryRetrieveLevel)CS=<1>STUDY
1 : 79[0008:0054](RetrieveAETitle)AE=<1>iMacIV
1 : 81[0008:0060](Modality)CS=<0>NULL
1 : 82[0008:0061](ModalitiesInStudy)CS=<1>CT
1 : 95[0008:1030](StudyDescription)LO=<1>ORBITAS
1 : 147[0010:0010](PatientName)PN=<1>Juan Pérez
1 : 148[0010:0020](PatientID)LO=<1>46382
1 : 425[0020:000D](StudyInstanceUID)UI=<1>1.2.840.113619.2.55.3.101357413.825.1251200228.13
1 : 427[0020:0010](StudyID)SH=<1>43969
2 : 57[0008:0005](SpecificCharacterSet)CS=<1>ISO_IR 100
2 : 64[0008:0020](StudyDate)DA=<1>08-09-2009
2 : 77[0008:0050](AccessionNumber)SH=<0>NULL
2 : 78[0008:0052](QueryRetrieveLevel)CS=<1>STUDY
2 : 79[0008:0054](RetrieveAETitle)AE=<1>iMacIV
2 : 81[0008:0060](Modality)CS=<0>NULL
2 : 82[0008:0061](ModalitiesInStudy)CS=<1>CT
2 : 95[0008:1030](StudyDescription)LO=<1>TX
2 : 147[0010:0010](PatientName)PN=<1>Carlos González
2 : 148[0010:0020](PatientID)LO=<1>47080
2 : 425[0020:000D](StudyInstanceUID)UI=<1>1.2.840.113619.2.55.3.101357413.656.1252387826.725
2 : 427[0020:0010](StudyID)SH=<1>44670

Con el siguiente código puedo insertar sólo el primer registro en una tabla, o sea los datos que necesito y que empiezan con 0

Código Delphi [-]
begin
Temporal.Close;
Temporal.EmptyTable;
Temporal.Open;
das := CnsDicomConnection1.ReceiveDatasets[i];
das.ListAttrinute(IntToStr(i) + ' : ', Memo1.Lines);
Temporal.Insert;
TemporalAcceso.AsString := das.GetString($0008, $0050);
TemporalNombre.AsString := das.GetString($0010, $0010);
Temporalid.AsString := das.GetString($0010, $0020);
TemporalFechaExamen.AsString := das.GetString($0008, $0020);
TemporalDescripcion.AsString := das.GetString($0008, $1030);
TemporalModalidad.AsString := das.GetString($0008, $0061);
Temporal.Post;
bsSkinStdLabel5.Caption:= InttoStr (Temporal.RecordCount);
end;

¿Existe alguna manera de insertar los registros siguientes, los que empiezan con 1, con 2, etc., en registros sucesivos?
Agradezco sinceramente cualquier aporte.

Saludos

roman 11-10-2012 01:49:59

Pero, es que yo no entiendo qué haces. ¿Qué es das? ¿Qué, exactamente, hace GetString?

// Saludos

AzidRain 11-10-2012 01:59:52

Mmmm me parece que esta obvio que tienes que hacer ya que "das" contiene todo lo que necesitas y solo basta decirle por ejemplo:

Código Delphi [-]
variable := das.GetString($0008, $0005); // aqui obtienes el primero de los que empiezan con 1

Solo sustituye "variable" por el campo que definiste como estático.

radenf 11-10-2012 02:37:19

Estimados roman y AzidRain :

Muchas gracias por responder.
Me faltó señalar que la información que se recibe desde el servidor en el Memo1 es el resultado de una consulta (DicomQuery) a una base de datos de imágenes de exámenes radiológicos.
das corresponde a un TDicomAttribute, osea la información que acompaña a las imágenes (Nombre del paciente, fecha de examen, tipo de examen, etc.), que es lo que necesito insertar en una Tabla (Temporal).
GetString solicita la información que corresponde a los atributos definidos de acuerdo al estandar Dicom3, por ejemplo ($0010, $0010) es el nombre del paciente y ($0008, $0020) es la fecha del examen.
Mi problema es que con ese código sólo logro insertar en la tabla de mi BD los datos del primer paciente que arroja la consulta y necesito insertar los datos de todos los pacientes, para realizar posteriormente el procedimiento de extraer dichas imágenes desde el servidor y poder visualizarlas en mi programa.
Lo que tú me señalas AzidRain es lo que tengo en el código que utilizo y que me permite insertar en la tabla el Nº de acceso, nombre, id, modalidad, descripción y fecha de examen, pero mi problema es que necesito insertar estos mismos datos de todos los pacientes que devuelve la consulta.
Los que empiezan con 0 corresponden al primer paciente, los que empiezan con 1 al segundo y así sucesivamente.
No sé si así se entiende mejor.

Saludos y muchas gracias.

roman 11-10-2012 02:45:36

Quizá me equivoque, pero no parece ser que esos componentes sean estándar, de manera que es difícil saber qué hacen tan sólo viendo tu código. Hablas de un memo, pero resulta que los datos vienen en un componente que, al menos yo, desconozco por completo.

Si realmente los tuvieras en un memo y tuvieras un método que lee los datos del primer paciente, pues bastaría entonces borrar esas líneas y pasar al siguiente paciente.

Lamento no poder ayudar más.

// Saludos

radenf 11-10-2012 02:51:37

Muchas gracias roman :

Quizás justamente la solución es ir borrando de a 12 líneas (que corresponden a cada paciente) luego de cada insert. Ya lo había considerado pero no conozco el código necesario para seleccionar y borrar las líneas de un Memo.
Los componentes que utilizo son las librerias DicomVCL para visualización de imágenes médicas.

Saludos y gracias de nuevo

roman 11-10-2012 03:44:18

Yo n o creo que estés borrando líneas de un memo sino de ese componente que usas. Pero bueno, borrar líneas de un memo debe ser algo así:

Código Delphi [-]
for I := 1 to 12 do
  Memo1.Lines.Delete(0); // Observa que no es Delete(I)

// Saludos

radenf 11-10-2012 12:23:34

Voy a probar y te cuento.

Muchas gracias

radenf 12-10-2012 00:56:28

No me funcionó eliminando líneas del Memo.
Seguiré intentando hasta dar con la solución.

Muchas gracias a todos

radenf 15-10-2012 00:54:19

Solucionado
 
Por fin encontré la solución al problema.
No era necesario trabajar con el memo sino cambiar el orden de los procesos, ya que como lo había estructurado bloqueaba el desarrollo del bucle de inserción y con este código funciona perfecto.

Código Delphi [-]
Temporal.Close;
Temporal.EmptyTable;
Temporal.Open;
if CnsDicomConnection1.C_FIND(das) then
begin
if CnsDicomConnection1.ReceiveDatasets.Count > 0 then
begin
for i := 0 to CnsDicomConnection1.ReceiveDatasets.Count - 1 do
begin
das := TDicomAttributes(CnsDicomConnection1.ReceiveDatasets[i]);
Temporal.Insert;
TemporalAcceso.AsString := das.GetString($0008, $0050);
TemporalNombre.AsString := das.GetString($0010, $0010);
Temporalid.AsString := das.GetString($0010, $0020);
TemporalFechaExamen.AsString := das.GetString($0008, $0020);
TemporalDescripcion.AsString := das.GetString($0008, $1030);
TemporalModalidad.AsString := das.GetString($0008, $0061);
Temporal.Post;
bsSkinStdLabel5.Caption:= InttoStr (Temporal.RecordCount);
end;

Muchas gracias roman y AzidRain por su ayuda, que me permitió al fin darme cuenta de mi error.

Salu2


La franja horaria es GMT +2. Ahora son las 07:18:37.

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