![]() |
consulta con ado, delphi7 y access
Hola realizo una consulta con ado y delphi 7 y al hacer un insert a la tabla y ejecutar execsql a veces me lo hace y otras veces no funciona el metodo, me estoy volviendo loco mañana colocare el codigo, alguna idea?.
|
Si pondrías el código que estas usando sería mejor para entender el problema y que alguien pueda ayudarte.
|
Cita:
Para que te hagas una idea, eso es como decir, "voy al coche, le doy a la llave y a veces arranca y a veces no". Pues puede ser que le falte gasolina, la bomba, la batería, el contacto, las escobillas si tiene carburador, las bujías, es starter,.... ;);) Lo normal sería tener un control de errores al realizar el INSERT de forma que si hay algun problema sepas qué error te estás dando. Además del código como te han comentado, detalla el error y con eso tal vez tengamos una idea. Puede ser que estén añadiendo claves duplicadas, valores incorrectos, problemas con índices únicos, bloqueos,... NOTA (de buen rollo): Con 108 posts en estos foros, la pregunta tiene tela... ;) |
Cita:
:D |
Otro ejemplo:
Es que no funciona la impresora. ¿Tiene el cable conectado al ordenador? Sí ¿Tiene el cable conectado a la electricidad? Sí ¿Pero está encendida? ¡¡¡ Ya funciona !!! |
Se que la consulta esta bien, la tiro directamente desde access y me la devuelve correctamente. Se que el problema es el ExecSql, tambien he probado a cerrar las tablas antes de llamar a esta consulta, me tiene loco proque a veces lo hace correctamente y a veces no, no entiendo el porque. Tambien he probado a crear la consulta en access que funciona y borrar la tabla y crearla con: CAsmm.Close; CAsmm.SQL.Clear; CAsmm.SQL.Text:='DROP TABLE ASM_MASIVO'; CAsmm.ExecSQL; CAsmm.Close; CAsmm.SQL.Clear; CAsmm.SQL.Text:='SELECT * INTO ASM_MASIVO FROM (SELECT * FROM CASM_MASIVO);'; CAsmm.ExecSQL; No lo hace tampoco. Gracias a todos. |
Cita:
|
Se que la consulta esta bien, la tiro directamente desde access y me la devuelve correctamente. Se que el problema es el ExecSql, tambien he probado a cerrar las tablas antes de llamar a esta consulta, me tiene loco proque a veces lo hace correctamente y a veces no, no entiendo el porque. Tambien he probado a crear la consulta en access que funciona y borrar la tabla y crearla con:
No lo hace tampoco. Gracias a todos. |
En la primera consulta, es posible que el SELECT DISTINCT no devuelva nada y por eso no se inserte nada en la tabla.
Pero en la segunda: No tiene sentido que no inserte nada si hay registros en CASM_MASIVO. En otros sistemas es necesario añadir un alias a la tabla (SELECT) para que funcione, aunque imagino que ya lo has probado: Otra opción que puedes probar es a almacenar esta consulta en access y llamarla desde Delphi. Si no recuerdo mal, puedes crae la consulta dentro del MDB y llamarla como si fuera un StoredProcedure (con sus parámetros). Aunque sólo sea por probar. Otra cosa que yo haría es añadir try..except a las llamadas. No se si fuera de este código tienes control de excepciones. Si es así es posible que esté sucediendo algún error y lo estés enmascarando. Encierra cada ExecSQL entre try..except, y visualiza el error si se produce. Por último, ten en cuenta, que no todas las consultas que funcionan en Access, funcionan igual desde Delphi+ADO. Access como entorno hare determinadas cosas que no se admiten desde Jet4, que es elmotor realmente. |
Si lo del alias ya me di cuenta que access cuando creas la consulta añade el alias al final, si lo probe y no tuve suerte.
Probé también a crear una consulta de access ya creada es CASM_MASIVO que funciona perfectamente en access. No tengo puestos try except porque realmente no da errores, simplemente no hace nada, ExecSql no actua sobre ninguna fila devuelve 0. He quitado el distinct y nada, hace lo mismo. |
No sé si he leido mal, pero sería:
insert into tabla (select from otra tabla) |
CASIMIRO:
El Insert Es Para Agregar Nuevos Registros A Una Tabla Existente: INSERT INTO ASM_MASIVO (SELECT * FROM ORIGEN); Si Queremos Crear Una Nueva Tabla Usamos El Into Y La Sintaxis Es (siendo el alias opcional), la nueva tabla no debe existir, por eso la borro con el drop antes. DROP TABLE ASM_MASIVO SELECT * INTO ASM_MASIVO FROM (SELECT * FROM CASM_MASIVO) AS ALIAS; |
Cita:
Por cierto, norma básica en cualquier foro, chat, conversación, etc. de internet, la número 6 en nuestra guía de estilo. Cita:
|
Si disculpa , pero como son instrucciones las puse en mayusculas. Ya lo cambio, no me deja cambiarlo, :). Solo me deja citar, no modificar.
|
Cita:
Saludos. |
He estado haciendo pruebas y me he dado cuenta de lo siguiente, si antes de ejecutar la sentencia sql, hago un showmessage de control, la consulta se ejecuta correctamente sino no se ejecuta, alguna idea de porque pasa esto y si se puede hacer un refresh o algo.
Gracias. |
No sé qué es un "showmessage de control", de todas formas no puede tener nada que ver.
|
Cita:
En vez del showmessage. Saludos. |
Como estas haciendo un insert masivo, tal vez te falta usar transacciones, prueba con usar:
BeginTrans: Al iniciar tu insercion masiva. Commit: Al terminar la inserción masiva. Rollback: Si algo falla cancela todo. Aplicalo a tu código y cuéntanos como te fue. Saludos. |
La franja horaria es GMT +2. Ahora son las 20:52:39. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi