![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Axel, sos un tipo groso, entendiste perfecto como era la cosa!
Lo acabo de leer y no estoy en la compu donde tengo el delphi, asi que cuando llegue me pongo a probarlo; te hago una consulta, esto va a hacer un select de la tabla en la base1 desde tal codigo hasta tal codigo; despues va a hacer un select de la segunda tabla en la segunda base donde el codigo sea el mismo que los seleccionados de la base1. Despues va a hacer un insert linea por linea en la tercer base hasta que se termine el select1. Mi consulta era, a veces pasa que en la base2 hay un codigo que no esta en la base1, como en el ejemplo que yo puse en el primer post. Por eso mi idea inicial era tomar el select de la primer base y hacer insert; tomar el select de la segunda base y hacer insert y despues update; y el select de la segunda tambien contemplarlo por lo que haya en los edit en vez de lo que me dio como resultado el select1, entonces si hay un codigo que existe en una pero en la otra no quedaria agregado igual. Igualmente si, la base1 es la que tiene la "mayoria" de los codigos, y entre las bases, si el codigo existe su nombre es igual, o sea que el campo codigo y nombre si los iba a tomar como referencia para crear la tabla nueva. Mi idea, es hacer esto a las N bases, o sea que en el ejemplo son dos, pero ponele que fueran 5 o 20 bases. Volvi a releer tu propuesta, y se me ocurrio lo siguiente (no lo escribo en codigo porque a algo le voy a errar, pero decime si mi teoria seria correcta) Tengo los componentes IBQuery1, 2, 3....N correspondiente a cada base para hacer los select, y un IBQueryX que va a ser el que grabe la info en la tabla que tenga los datos de todas. Empiezo con un select en el query1 desde y hasta lo que me indiquen los edit. Me posiciono en la primer linea; abro un while query1 eof y en una variable string voy agregando como vos hiciste los campos, nada mas que el precio2 lo dejo vacio, uso el queryX para grabar a la tabla nueva. Cuendo termina el while hago un select del query2, igual que el 1, contemplando los edit desde y hasta, abro un while query2 eof y en la variable agrego todo el insert (que si ya se habia insertado con el del query1 lo va a saltear, y sino lo va a agregar) y despues un update (para agregarle el precio2). Termina el while, y asi sucesivamente hasta la cantidad de bases que tenga, un select de la tercera, abro while, insert y update, cierro while; un select de la cuarta, abro while etc etc etc. En teoria funcionara? Te cuento cuando llego a la compu donde tengo delphi. Igualmente, me dieste una idea de como arrancar! mil gracias! Que lindo seria esto si laburara con firebird 2.1, donde podes hacer un "UPDATE OR INSERT" que contempla justo estos casos. Última edición por pnikkosis fecha: 02-12-2009 a las 13:56:53. |
|
#2
|
||||
|
||||
|
Con más de 2 bases de datos se complica la cosa. Yo creo que sí funcionaría, aunque veo un par de inconvenientes:
1.- Con tanto INSERT y UPDATE no se que rendimiento obtendrías. Sería cuestión de probarlo. 2.- Cuando llegas a este punto: Cita:
Tengo en mente otra solución: utilizando tablas temporales (una por cada tabla de cada base de datos) y un procedimiento almacenado con 2 cursores. Las tablas temporales las rellenarías tal y como hemos visto hasta ahora, recorriendo las IBQuery y utilizando el criterio "desde" y "hasta". Una vez rellenas (para evitar errores te recomiendo que las tablas se llamen igual o parecido en la base de datos final, y los campos también) el SP sería algo tal que así:
Un SP es más potente y más rapido que tanto INSERT y UPDATE. Tendrías que depurarlo un poco y adaptarlo a tus necesidades. Como ya he dicho antes todo es cuestión de probarlo.
__________________
No hope, no dreams, no love, my only escape is Underground |
|
#3
|
||||
|
||||
|
Leyendo articulos de como hacer insert+update dependiendo de si existe o no un primary key en la tabla, llegue a lo siguiente:
(de nuevo, estoy con firebird 1.5, que boludes seria si tuviera 2.1) Un SP con algo como esto: Código:
if exists('CODIGO') then
update TABLANUEVA set
LOCAL2 = (el PRECIO que me dio el select del query2)
where CODIGO = (codigo del select del query2);
else insert into TABLANUEVA (blablablabla el insert normal)
entonces en el primer while (del query1 de la base1) hago un insert unicamente porque en la base nueva no hay ningun dato. Y a partir de la segunda base hasta la baseN dentro de los while corro un SP como este, si el codigo ya existe va a actualizar el campo que le correspone a esa tabla (el precio) y sino existe va a insertar la linea entera. Mi problema radica en que no tengo la menor idea como hacer un SP jaja, estuve leyendo pero no entiendo muy bien eso de especificar input y outputs, y tambien me doy cuenta que en el stored procedure yo tendria que hacer referencia a campos de selects que estan en delphi, y eso tampoco tengo idea; por ejemplo, si empezara el if exists ('CODIGO'), que hace referencia al campo codigo del select del query2, pondria en delphi algo como if exists ('+IBQuery2.FieldByName('CODIGO').AsString+'), pero como le digo a firebird que ese campo codigo esta en un select que hice con un query en delphi? Sino lo que se me ocurrio hacer en delphy es directamente tirar un CREATE PROCEDURE con todos esos datos adentro y despues ejecutar el ibquery, pero me parece medio al pedo eso, tendria que hacer un create SP y un drop SP por cada linea del select, le saca el proposito al stored procedure. Asi que ahora ando peleando con eso. ----------- Soy un nabo no? hay un componente que es IBStoredProcedure, decime que lo linkeo a la base y despues en StoredProcName elijo el que tengo en la base y me deja linkear variables de delphi con variables de firebird Última edición por pnikkosis fecha: 03-12-2009 a las 23:32:41. |
|
#4
|
||||
|
||||
|
Ok, lo tengo casi listo, tengo un problema con el SP nada mas, te cuento lo que hice:
Ya aprendi a asignarle valores a las variables desde delphi,haciendo IBStoredProc1.Params[0...N].AsString o ParamsByName y el nombre, y despues que tengo todos asigandos hago .ExecProc me funciona el correrlo Ahora, tengo dos problemas con ese SP: 1, no me esta tomando cuando el codigo existe, ponele que tengo el codigo 001 en la tabla y pongo como la variable :codigo 001, no corre el update sino que hace un insert y me quedan dos filas en la tabla con el codigo 001, raro. Y el otro problema que tengo es... no se si como actualiza o que, pero hice una interfaz chica de prueba en delphi, con 3 edits le asigno valores a las variables y un boton corre el SP, pero hasta que no cierro la aplicacion la tabla parece que no se actualiza; uso el IBExpert como Database manager y desconecto la base, la vuelvo a abrir y lo que corri en el SP no aparece, pero si cierro la aplicacion de delphi, ahi se graba a la base y me aparece. Tiene algo que ver con hacer un commit? Tengo que tocar el componente IBTransaction? |
|
#5
|
||||
|
||||
|
A ver, vamos por partes.
Cita:
![]() Cita:
Cita:
De todas formas sigo manteniendo en pie mi planteamiento anterior ya que ejecutarías el SP una sola vez, y tú lo vas a ejecutar por cada registro que exista. Si hay 6000 pues 6000 veces pero me reitero otra vez, todo es cuestión de probarlo y ver el rendimiento que obtienes.
__________________
No hope, no dreams, no love, my only escape is Underground |
|
#6
|
||||
|
||||
|
Ahora entendí lo de los primary keys y foreing keys... me largue a usar firebird sin entender un joraca! jaja; en fin, agregue "codigo" como PK, y volvi a correr el SP asignandole valores, ahora si no existe lo inserta (igual que antes), pero cuando vuelvo a ponerle el mismo codigo e intentar correrlo me tira que no puede haber dos filas con el mismo codigo, asi que el IF no me esta resolviendo bien el THEN, deberia hacer un UPDATE pero lo saltea, estara mal la condicion de (:codigo = 'T.CODIGO')?
Porque T.CODIGO entre comillas simples no esta haciendo que eso sea como un string en vez de reconocerlo como referencia al campo de una tabla?, igualmente probé sacandole las comillas simples y cuando quiero compilar el SP me dice justo que hay un error en esa linea, column unknown... pero la columna codigo esta en esa tabla. Cuando adentro del update hago referencia a la columna PRECIO no me tira el mismo error. ------------- el problema esta en la igualdad me parece... yo no le puedo decir a una igualdad que una variable con X valor sea igual a una columna entera, no le estoy espeficando a que CODIGO tiene que ser igual; deberia hacer un IF EXISTS pero no me reconoce el EXISTS ![]() Última edición por pnikkosis fecha: 04-12-2009 a las 15:51:41. |
|
#7
|
||||
|
||||
|
Cierto, no me había fijado antes, 'T.CODIGO' lo está interpretando como una cadena de caracteres.
No estoy seguro de que lo que pretendes con ese if se pueda hacer de esa manera, pues como bien has dicho en la última frase no puedes comparar una variable (en este caso un parámetro de entrada) con una columna entera de una tabla. Puedes hacerlo con un EXISTS como te dije en el SP que puse más arriba: Esta consulta mira si ya existe el codigo en la tabla, y entonces haces un if:
si :COD es null haces el INSERT, si no haces el UPDATE. A ver así que tal.
__________________
No hope, no dreams, no love, my only escape is Underground |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Tomar datos del lector de código de barras | jam888 | OOP | 4 | 22-03-2010 17:53:03 |
| Tomar datos de otra aplicacion | dblx | API de Windows | 4 | 23-12-2008 01:16:38 |
| Tomar datos de excel | vinagre3ro | Internet | 2 | 04-10-2006 09:59:28 |
| Hola soy muy nueva en esto de las bases de datos y deseo imprimir tablas | nuri | Impresión | 1 | 05-07-2005 19:49:31 |
| Como mostrar los datos para luego insertarlos? | judoboy | OOP | 8 | 14-05-2003 09:51:51 |
|