PDA

Ver la Versión Completa : Insertar información de Memo en Tabla de BD


radenf
11-10-2012, 01:34:26
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

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:


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í:


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
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.

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