
[RESUELTO] Recursividad: Véase Recursividad (Circular datalinks con MS SQLServer 2000)
#1
Escrito 09 marzo 2010 - 09:58
Tengo una base de datos en MS SQLServer 2000, conectada remotamente a una aplicación que estoy "actualizando" y que ahora utiliza ADOConnection, tres ADOTables y sus respectivos DataSource y todos los parámetros que me permiten explotar las tablas..., PEROOOO cuando creo explícitamente el Data Module que los contiene como parte del inicio de mi aplicación. Obviamente ésta se bloquea y no permite iniciar.
Al ver ésto, me pongo a hacer rastreo desde el IDE, y lo simpático del caso es que al activar la base de datos y poner como activa CUALQUIERA de las tablas, se marca el dichoso error. ¿Alguien tiene alguna solución o sugerencia qué hacerme, por favor?
#2
Escrito 09 marzo 2010 - 10:02
#3
Escrito 09 marzo 2010 - 10:21
"Circular datalinks not allowed"
#4
Escrito 09 marzo 2010 - 10:22
Me parece que en alguna tabla tienes una referencia inadecuada ya sea en el dataset o en algún campo lookup.
Salud OS
#5
Escrito 09 marzo 2010 - 10:34
¿ En tiempo de diseño no tienes problema para activar el ADOConnection y las ADOTables ?
Me parece que en alguna tabla tienes una referencia inadecuada ya sea en el dataset o en algún campo lookup.
Salud OS
Desde el diseño está el problema, o más bien, aparece también solamente que no se "cuelga" Delphi. Lo interesante es que ya revisé las tablas, la conexión al cable, la máquina donde reside la base de datos, la instalación de SQL Server y de Delphi..., y a pesar que todo está correcto, el error aparece continuamente.
#6
Escrito 09 marzo 2010 - 10:43
¿ En tiempo de diseño no tienes problema para activar el ADOConnection y las ADOTables ?
Me parece que en alguna tabla tienes una referencia inadecuada ya sea en el dataset o en algún campo lookup.
Salud OS
Desde el diseño está el problema, o más bien, aparece también solamente que no se "cuelga" Delphi. Lo interesante es que ya revisé las tablas, la conexión al cable, la máquina donde reside la base de datos, la instalación de SQL Server y de Delphi..., y a pesar que todo está correcto, el error aparece continuamente.
¿ Algún Firewall, Proxie, AV que esté bloqueando la conexión ?
Salud OS
#7
Escrito 09 marzo 2010 - 10:45
¿ Algún Firewall, Proxie, AV que esté bloqueando la conexión ?
No hay nada..., es más, se eliminó todo aquéllo que pudiera interferir..., te digo que hasta el cableado revisamos, así de paranoide me puse.
#8
Escrito 09 marzo 2010 - 10:52
[5067E82C]{dbrtl140.bpl} DB.DatabaseError (Line 2885, "DB.pas" + 3) + $E [50D44E12]{vcldb140.bpl} DBCtrls.TDBLookupControl.CheckNotCircular (Line 4492, "dbctrls.pas" + 2) + $12 [50D451AF]{vcldb140.bpl} DBCtrls.TDBLookupControl.UpdateListFields (Line 4586, "dbctrls.pas" + 7) + $3 [50D4736B]{vcldb140.bpl} DBCtrls.TDBLookupComboBox.KeyValueChanged (Line 5484, "dbctrls.pas" + 16) + $15 [50D47385]{vcldb140.bpl} DBCtrls.TDBLookupComboBox.UpdateListFields (Line 5488, "dbctrls.pas" + 1) + $2 [50D44B74]{vcldb140.bpl} DBCtrls.TListSourceLink.ActiveChanged (Line 4421, "dbctrls.pas" + 1) + $B [5068C421]{dbrtl140.bpl} DB.TDataLink.SetActive (Line 9337, "DB.pas" + 5) + $4 [5068C450]{dbrtl140.bpl} DB.TDataLink.UpdateState (Line 9352, "DB.pas" + 1) + $15 [5068C56E]{dbrtl140.bpl} DB.TDataLink.DataEvent (Line 9413, "DB.pas" + 1) + $7 [5068CBB7]{dbrtl140.bpl} DB.TDataSource.NotifyLinkTypes (Line 9703, "DB.pas" + 4) + $9 [5068CBE6]{dbrtl140.bpl} DB.TDataSource.NotifyDataLinks (Line 9710, "DB.pas" + 3) + $8 [5068C9E7]{dbrtl140.bpl} DB.TDataSource.SetState (Line 9632, "DB.pas" + 5) + $6 [5068CA32]{dbrtl140.bpl} DB.TDataSource.UpdateState (Line 9645, "DB.pas" + 1) + $A [5068CC00]{dbrtl140.bpl} DB.TDataSource.DataEvent (Line 9715, "DB.pas" + 1) + $7 [5069286D]{dbrtl140.bpl} DB.TDataSet.DataEvent (Line 12157, "DB.pas" + 36) + $14 [50D01FCC]{adortl140.bpl} ADODB.TCustomADODataSet.DataEvent (Line 3935, "ADODB.pas" + 9) + $6 [5069084C]{dbrtl140.bpl} DB.TDataSet.SetState (Line 11160, "DB.pas" + 5) + $6 [50690D5F]{dbrtl140.bpl} DB.TDataSet.OpenCursorComplete (Line 11335, "DB.pas" + 7) + $5 [50690C8F]{dbrtl140.bpl} DB.TDataSet.SetActive (Line 11306, "DB.pas" + 15) + $3 [50690CD3]{dbrtl140.bpl} DB.TDataSet.SetActive (Line 11313, "DB.pas" + 22) + $E [5005164A]{rtl140.bpl } TypInfo.SetOrdProp (Line 1723, "TypInfo.pas" + 27) + $0 [20D95FB6]{designide140.bpl} DesignEditors.TPropertyEditor.SetOrdValue (Line 841, "DesignEditors.pas" + 2) + $E [20DDB035]{designide140.bpl} VCLEditors.TBooleanProperty.MouseUp (Line 1838, "VCLEditors.pas" + 5) + $10 [20EAFF1D]{vclide140.bpl} PropBox.TCustomPropListBox.ItemMouseUp (Line 1625, "propbox.pas" + 16) + $1B [20EB0113]{vclide140.bpl} PropBox.TCustomPropListBox.MouseUp (Line 1690, "propbox.pas" + 1) + $D [5029679C]{vcl140.bpl } Controls.TControl.DoMouseUp (Line 7306, "Controls.pas" + 2) + $28 [50296818]{vcl140.bpl } Controls.TControl.WMLButtonUp (Line 7319, "Controls.pas" + 9) + $6 [20EB5758]{vclide140.bpl} IDEInspListBox.TInspListBox.WMLButtonUp (Line 1615, "IDEInspListBox.pas" + 3) + $4 [50295DFC]{vcl140.bpl } Controls.TControl.WndProc (Line 7062, "Controls.pas" + 91) + $6 [50299F53]{vcl140.bpl } Controls.TWinControl.IsControlMouseMsg (Line 9596, "Controls.pas" + 1) + $9 [5029A6C0]{vcl140.bpl } Controls.TWinControl.WndProc (Line 9819, "Controls.pas" + 144) + $6 [501F073C]{vcl140.bpl } StdCtrls.TCustomListBox.WndProc (Line 6130, "StdCtrls.pas" + 37) + $4 [50299D60]{vcl140.bpl } Controls.TWinControl.MainWndProc (Line 9540, "Controls.pas" + 3) + $6 [50076360]{rtl140.bpl } Classes.StdWndProc (Line 13014, "Classes.pas" + 8) + $0 [502C8749]{vcl140.bpl } Forms.TApplication.ProcessMessage (Line 9784, "Forms.pas" + 30) + $1 [502C878E]{vcl140.bpl } Forms.TApplication.HandleMessage (Line 9814, "Forms.pas" + 1) + $4 [502C8AB9]{vcl140.bpl } Forms.TApplication.Run (Line 9951, "Forms.pas" + 26) + $3 [0042D94A]{bds.exe } bds.bds (Line 200, "" + 8) + $FFFB
Ésto es el "dump" del error que me marca EN TIEMPO DE DISEÑO cuando pongo Active := True las tablas. Aparentemente NO QUEDAN ACTIVAS, pero al quitarles y devolverles el foco, ¡¡¡SORPRESAAAAAA!!!, están con el checkbox de "Active" con su respectiva marca.
#9
Escrito 09 marzo 2010 - 10:59
Salud OS
#10
Escrito 09 marzo 2010 - 11:22
Yo haría un test tabla por tabla para ver en cual de ellas está surgiendo el error, si es en cualquiera tendrás un problema en el string de la conexión...
De hecho el error surge en CASI TODAS las tablas, excepto en UNA que tengo fuera del Data Module en una forma que la usa en exclusiva.
Ya revisé la cadena de conexión y el problema continúa presentándose; creo finalmente que tendré que hacerlo todo por ADOQuery's, ya que éstos hasta el momento no han fallado.
#11
Escrito 09 marzo 2010 - 11:34
Salud OS
#12
Escrito 09 marzo 2010 - 11:39
Me parece entonces que deberías crear otro datamodule y pasar una por una de las tablas, tal vez hay algo en ese datamodule que está afectando
Pues a menos que sea el "dialogs" en el uses, no le veo mucho que esté afectando...
unit Udatos; interface uses SysUtils, Classes, DB, DBTables, bde, ADODB, Dialogs; type TDatos = class(TDataModule) Dstipoofi: TDataSource; Dsoficinas: TDataSource; DSdelega: TDataSource; Dsconsulta: TDataSource; ADOCnnctn: TADOConnection; tbltipoofi: TADOTable; tbloficinas: TADOTable; tbldelega: TADOTable; qryconsulta: TADOQuery; tbltipoofiClave: TIntegerField; tbltipoofiConcepto: TStringField; procedure DataModuleCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Datos: TDatos; implementation {$R *.dfm} procedure TDatos.DataModuleCreate(Sender: TObject); begin try ADOCnnctn.Connected := True; except MessageDlg('Base de datos no accesible.', mtError, [mbOK], 0); end; tbltipoofi.Active := True; tbloficinas.Active := True; (* tbldelega.Active := True;*) end; end.
Como pueden ver, está CASI vacío, gracias a qué ese condenado error incachable no me ha dejado avanzar más...




#13
Escrito 09 marzo 2010 - 11:42
1. Hacer nuevo el proyecto
2. Prueba y error.
Salud OS
#14
Escrito 09 marzo 2010 - 11:47
.
.
.
1. Hacer nuevo el proyecto
2. Prueba y error.
.
.
3. Cambiar los componentes que están "fallando".
Y sí, optaré por la tercera vía, ya que el tiempo que me asignaron no me permitirá rehacer TODO el proyecto completo, mucho menos hacer pruebas para detectar por dónde está el problema. Voy a dar el tema como cubierto, pero si alguien tiene alguna idea, hágamela saber.
#15
Escrito 09 marzo 2010 - 11:48
El problema esta en el proyecto, cuando le incorporaste el Datamodule no empieza primero, por esta razon no abre las tablas, no hay conexión.
Puede ser el orden de inicio del proyecto, para mi es lo mas lógico.
No deberia enviar error ni siquiera mostrar el mensaje ya que simplemente no llega hasta ahi.
Otra cosa a tomar en cuenta: El adoConnection esta enlazado a SQLServer por el mismo, si cambia la direccion por x razon no lo encontrara.
Saludos
PD: Como me gusta ADO. jejeje
#16
Escrito 09 marzo 2010 - 11:54
...
El problema esta en el proyecto, cuando le incorporaste el Datamodule no empieza primero, por esta razon no abre las tablas, no hay conexión...
Pues algo así me encontré yo..., hasta que modifiqué el orden de creación.
program Pdirectorio; uses Forms, windows, dialogs, Umenu in '..\formas\Umenu.pas' {frminicio}, Uacerca in '..\formas\Uacerca.pas' {AboutBox}, Ucatofi in '..\formas\Ucatofi.pas' {Frmcatofi}, Ucaptura in '..\formas\Ucaptura.pas' {frmcaptura}, Udatos in '..\formas\Udatos.pas' {Datos: TDataModule}, Ucatdel in '..\formas\Ucatdel.pas' {frmcatdel}, Uconsulta in '..\formas\Uconsulta.pas' {Frmconsulta}, Uinicio in '..\formas\Uinicio.pas' {Frmpassword}, Ulectura in '..\formas\Ulectura.pas' {frmsololectura}, Ubusca in '..\formas\Ubusca.pas' {frmbusca}; {$R *.res} const NombreMutex='Tu aplicación'; Var Mimutex:Thandle; begin mimutex:= createmutex(nil,true,nombremutex); if mimutex=0 then begin Showmessage('Error creando mutex'); halt; end; if getlasterror=ERROR_ALREADY_EXISTS then begin Showmessage('Ya está funcionando la aplicación'); halt; end; Application.Initialize; Application.CreateForm(TDatos, Datos); Application.CreateForm(TFrmpassword, Frmpassword); Application.CreateForm(Tfrminicio, frminicio); Application.CreateForm(TAboutBox, AboutBox); Application.CreateForm(TFrmcatofi, Frmcatofi); Application.CreateForm(Tfrmcaptura, frmcaptura); Application.CreateForm(Tfrmcatdel, frmcatdel); Application.CreateForm(TFrmconsulta, Frmconsulta); Application.CreateForm(Tfrmsololectura, frmsololectura); Application.CreateForm(Tfrmbusca, frmbusca); Application.Run; closehandle(mimutex); end.
Aclaro. Éste código no es mío, por lo que cualquier "error" generado por el sistema se hace evidente cuando comienzo a modernizarlo.
#17
Escrito 09 marzo 2010 - 12:00
Yo quitaría un montón de cosas del inicio, pero ya saben......
Intenta esto:
unit Udatos; interface uses SysUtils, Classes, DB, DBTables, bde, ADODB, Dialogs; type TDatos = class(TDataModule) Dstipoofi: TDataSource; Dsoficinas: TDataSource; DSdelega: TDataSource; Dsconsulta: TDataSource; ADOCnnctn: TADOConnection; tbltipoofi: TADOTable; tbloficinas: TADOTable; tbldelega: TADOTable; qryconsulta: TADOQuery; tbltipoofiClave: TIntegerField; tbltipoofiConcepto: TStringField; procedure DataModuleCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Datos: TDatos; implementation {$R *.dfm} procedure TDatos.DataModuleCreate(Sender: TObject); begin try ADOCnnctn.Open; except MessageDlg('Base de datos no accesible.', mtError, [mbOK], 0); end; ShowMessage('ya toy'); // tbltipoofi.Active := True; // tbloficinas.Active := True; //(* // tbldelega.Active := True;*) end; end.
Saludos
#18
Escrito 09 marzo 2010 - 12:07
Yo quitaría un montón de cosas del inicio, pero ya saben...
Yo también, pero como comenté, estoy "modernizando" un código que no es mío y estamos de acuerdo que ésa actividad es la peor que le puedes poner a un programador. Meterse a la cabeza y la lógica de otro programador muchas veces es complicado.
delphi
. . . ShowMessage('ya toy'); . . .
Realizado..., y se conecta de perlas. El problema (creo que ya lo estoy "arrinconando") es una combinación de una mala versión del cliente de MSSQLSrvr y el motor de base de datos. He escuchado algunas malas críticas respecto a la eficiencia de SQLServer 2000, y creo que las estoy afirmando.
#19
Escrito 09 marzo 2010 - 12:11
Antes de cantar victoria yo intentaria esto:
procedure TDatos.DataModuleCreate(Sender: TObject); begin try ADOCnnctn.Open; ShowMessage('ya toy'); except MessageDlg('Base de datos no accesible.', mtError, [mbOK], 0); end; // tbltipoofi.Active := True; // tbloficinas.Active := True; //(* // tbldelega.Active := True;*) end;
Después analizar donde estan estos adotables o querys posteriores que se quieren activar.
Saludos
#20
Escrito 09 marzo 2010 - 12:19
delphi
. . . ADOCnnctn.Open; ShowMessage('ya toy'); . . .
Después analizar donde estan estos adotables o querys posteriores que se quieren activar.
Realizado..., y el resultado es satisfactorio totalmente, es decir, se conecta la base de datos y avisa.
Entre otras cosas, estoy monitoreando hasta el tipo de dato que compone las columnas de las tablas, por si ése fuera alguna especie de desencadenante del error.