Using ADO in C/SIDE

Does anybody have any experience using ADO automation objects in C/SIDE to manipulate an MSAccess database? I’d really like to know if this is a viable thing to attempt before I waste any time trying it. Thanks in advance. Chris.

No problem using ADO. Please use the search function. You’ll find a lot of topics on ADO. Here’s a little example: http://www.mbsonline.org/forum/topic.asp?TOPIC_ID=2745&SearchTerms=ADO //Lars

Hi, With Access database no problem, but I’ve experienced problems with inserting and updating records with *.dbf (ADO v2.6).

Conf.GET; Dir.RESET; Dir.SETRANGE(Dir.Transferido, FALSE); IF NOT Dir.FIND(’-’) THEN exit; xLinDiaGen.INIT; xLinDiaGen.“Nombre libro diario” := ‘GENERAL’; xLinDiaGen.“Nombre sección diario” := ‘IMPORT’; LinDiaGen.RESET; LinDiaGen.SETRANGE(LinDiaGen.“Nombre libro diario”, xLinDiaGen.“Nombre libro diario”); LinDiaGen.SETRANGE(LinDiaGen.“Nombre sección diario”, xLinDiaGen.“Nombre sección diario”); LinDiaGen.DELETEALL; IF NOT SecDiaGen.GET( xLinDiaGen.“Nombre libro diario”, xLinDiaGen.“Nombre sección diario”) THEN BEGIN SecDiaGen.INIT; SecDiaGen.“Nombre libro diario” := xLinDiaGen.“Nombre libro diario”; SecDiaGen.Nombre := xLinDiaGen.“Nombre sección diario”; SecDiaGen.INSERT(TRUE); END; ActualizadBase := TRUE; REPEAT Dir.TESTFIELD(Dir.Directorio); ImportaEjecicio; UNTIL Dir.NEXT = 0; OnPostReport() ImportaEjecicio() NombreBaseDatos := ‘c:\import.mdb’; sql_conexion_access := ‘“JetTable”, ";DATABASE=’+NombreBaseDatos + ‘";’; IF STRPOS(OSVERSION,‘58’) <> 0 THEN ComandoSistemaOperativo := ‘C:\COMMAND.COM’; IF STRPOS(OSVERSION,‘T’) <> 0 THEN ComandoSistemaOperativo := ‘C:\WINNT\SYSTEM32\CMD.EXE’; Ventana.OPEN(‘Procesando #1##############’+ ‘Elemento #2##############’); CREATE(Engine); IF F.OPEN(NombreBaseDatos) THEN BEGIN F.CLOSE; SHELL(ComandoSistemaOperativo, ‘/c’, ‘del’,NombreBaseDatos); SLEEP(1000); //BD := Engine.OpenDatabase(NombreBaseDatos, FALSE) END; BD := Engine.CreateDatabase(NombreBaseDatos,’;LANGID=0X040A;CP=1252;COUNTRY=0;pwd=sa’); //BorraTablas; Tablas[1] := ‘DEPART’; Tablas[2] := ‘SUBCTA’; Tablas[3] := ‘DIARIO’; sql := ‘dBASE IV;DATABASE=’ + Dir.Directorio; Tbls := BD.TableDefs; //ImportaDep; ImportaCta; ImportaProy; ImportaLinDiaGen; CLEAR(Tbl); BD.Close; CLEAR(BD); CLEAR(Engine); ImportaDep() i := 1; Ventana.UPDATE(1,‘DEPARTAMENTOS’); IF Dir.“No Transferir Dptos” THEN EXIT; CreaTabla; REPEAT Campos := RS.Fields; Ventana.UPDATE(2,T); T := FORMAT(Campos.Item(‘CODIGO’).Value); DptoInsert; RS.MoveNext; UNTIL RS.EOF; //IF Departamento.GET(Qd.Fields(‘CODIGO’)) THEN; ImportaLinDiaGen() i := 3; Ventana.UPDATE(1, ‘DIARIO GENERAL’); NoSigMov := 0; IF LinDiaGen.FIND(’+’) THEN NoSigMov := LinDiaGen.“Nº línea”; CreaTabla; IF ActualizadBase THEN BEGIN EjecutaSQL(‘DEPARTA’,0); EjecutaSQL(‘ASIEN’,1); EjecutaSQL(‘FECHA’,1); EjecutaSQL(‘SUBCTA’,0); EjecutaSQL(‘CONTRA’,1); EjecutaSQL(‘PTADEBE’,1); EjecutaSQL(‘CONCEPTO’,0); EjecutaSQL(‘PTAHABER’,1); EjecutaSQL(‘eurodebe’,1); EjecutaSQL(‘eurohaber’,1); EjecutaSQL(‘factura’,1); EjecutaSQL(‘clave’,0); END; Ventana.UPDATE(1, ‘DIARIO GENERAL’); RS := BD.OpenRecordset( Tablas[i]+‘1’); //IF RS.NoMatch THEN // EXIT; REPEAT Campos := RS.Fields; T := FORMAT(Campos.Item(‘ASIEN’).Value); Ventana.UPDATE(2,T); DiaGenInsert; RS.MoveNext; UNTIL RS.EOF; ImportaProy() IF Dir.“No Transferir Proyectos” THEN EXIT; ImportaCta() i := 2; Ventana.UPDATE(1,‘CUENTAS CONTABLES’); CreaTabla; IF ActualizadBase THEN BEGIN EjecutaSQL(‘NIF’,0); EjecutaSQL(‘DOMICILIO’,0); EjecutaSQL(‘POBLACION’,0); EjecutaSQL(‘PROVINCIA’,0); EjecutaSQL(‘CODPOSTAL’,0); END; REPEAT Campos := RS.Fields; T := FORMAT(Campos.Item(‘COD’).Value); Ventana.UPDATE(2,T); CtaInsert; RS.MoveNext; UNTIL RS.EOF; DptoInsert() IF Departamento.GET(T) THEN EXIT; Departamento.INIT; Departamento.Código := T; Departamento.Nombre := COPYSTR(FORMAT(Campos.Item(‘DESCRIP’).Value),1,MAXSTRLEN(Departamento.Nombre)); Departamento.INSERT; CtaInsert() IF NOT Cta.GET(T) THEN Cta.INIT; Cta.VALIDATE(Cta.“Nº”,T); Cta.VALIDATE(Cta.Nombre,COPYSTR(FORMAT(Campos.Item(‘TITULO’).Value),1,MAXSTRLEN(Cta.Nombre))); IF STRLEN(Cta.“Nº”) < 5 THEN Cta.“Tipo mov.” := 1; IF COPYSTR( Cta.“Nº”,1,1) IN [‘6’,‘7’] THEN IF Cta.“Tipo mov.” = Cta.“Tipo mov.”::Auxiliar THEN Cta.“Cta. regularización” := ‘1290000’; EVALUATE(V,COPYSTR(Cta.“Nº”, 3,18)); CASE COPYSTR(Cta.“Nº”, 1,2) OF ‘40’,‘41’,‘46’: WITH Prov DO BEGIN INIT; CASE COPYSTR(Cta.“Nº”, 1,2) OF ‘40’: “Nº” := ‘p’+ FORMAT(V); ‘41’: “Nº” := ‘a’+ FORMAT(V); ‘46’: “Nº” := ‘e’+ FORMAT(V); END; IF xProv.GET(Prov.“Nº”) THEN Prov := xProv; VALIDATE(Nombre, Cta.Nombre); “CIF/NIF” := COPYSTR(FORMAT(Campos.Item( ‘NIF’ ).Value),1,MAXSTRLEN(“CIF/NIF”)); Dirección := COPYSTR(FORMAT(Campos.Item( ‘DOMICILIO’ ).Value),1,MAXSTRLEN(Dirección)); Población := COPYSTR(FORMAT(Campos.Item( ‘POBLACION’ ).Value),1,MAXSTRLEN(Población)); Provincia := COPYSTR(FORMAT(Campos.Item( ‘PROVINCIA’ ).Value),1,MAXSTRLEN(Provincia)); “C.P.” := COPYSTR(FORMAT(Campos.Item( ‘CODPOSTAL’ ).Value),1,MAXSTRLEN(“C.P.”)); IF NOT INSERT(TRUE) THEN Prov := xProv; //IF GrProv.GET(“Nº”) THEN // EXIT; IF Dir.“Grupo Cont. por clie/prov/b” THEN BEGIN GrProv.INIT; GrProv.Código := “Nº”; GrProv.“Cta. proveedor” := Cta.“Nº”; IF NOT GrProv.INSERT THEN ; END ELSE GrProv.Código := Dir.“Grupo Cont. Prov”; “Grupo contable proveedor” := GrProv.Código; MODIFY; END; ‘43’,‘44’: WITH Clie DO BEGIN INIT; CASE COPYSTR(Cta.“Nº”, 1,2) OF ‘43’: “Nº” := ‘c’+ FORMAT(V); ‘44’: “Nº” := ‘d’+ FORMAT(V); END; IF xClie.GET(Clie.“Nº”) THEN Clie := xClie; VALIDATE(Nombre, Cta.Nombre);; “CIF/NIF” := COPYSTR(FORMAT(Campos.Item( ‘NIF’ ).Value),1,MAXSTRLEN(“CIF/NIF”)); Dirección := COPYSTR(FORMAT(Campos.Item( ‘DOMICILIO’ ).Value),1,MAXSTRLEN(Dirección)); Población := COPYSTR(FORMAT(Campos.Item( ‘POBLACION’ ).Value),1,MAXSTRLEN(Población)); Provincia := COPYSTR(FORMAT(Campos.Item( ‘PROVINCIA’ ).Value),1,MAXSTRLEN(Provincia)); “C.P.” := COPYSTR(FORMAT(Campos.Item( ‘CODPOSTAL’ ).Value),1,MAXSTRLEN(“C.P.”)); IF NOT INSERT(TRUE) THEN Clie := xClie; //IF GrClie.GET(“Nº”) THEN // EXIT; IF Dir.“Grupo Cont. por clie/prov/b” THEN BEGIN GrClie.INIT; GrClie.Código := “Nº”; GrClie.“Cta. clientes” := Cta.“Nº”; IF NOT GrClie.INSERT THEN ; END ELSE GrClie.Código := Dir.“Grupo Cont. Prov”; “Grupo contable cliente” := GrClie.Código; MODIFY; END; ‘57’: WITH Ban DO BEGIN INIT; “Nº” := FORMAT(V); VALIDATE(Nombre, Cta.Nombre);; IF NOT INSERT THEN EXIT; GrBan.INIT; GrBan.Código := “Nº”; GrBan.“Cta. banco” := Cta.“Nº”; “Grupo contable banco” := “Nº”; IF NOT GrBan.INSERT THEN ; MODIFY; END; END; IF NOT Cta.INSERT(TRUE) THEN Cta.MODIFY; DiaGenInsert() EVALUATE(LinDiaGen.Descripción,COPYSTR(FORMAT(Campos.Item(‘CONCEPTO’).Value),1,MAXSTRLEN(LinDiaGen.Descripción))); IF LinDiaGen.Descripción = ‘Asiento de Apertura’ THEN EXIT; IF LinDiaGen.Descripción = ‘Asiento de Cierre’ THEN EXIT; NoSigMov := NoSigMov + 10000; LinDiaGen.INIT; LinDiaGen.“Nombre libro diario” := xLinDiaGen.“Nombre libro diario”; LinDiaGen.“Nombre sección diario” := xLinDiaGen.“Nombre sección diario”; LinDiaGen.“Nº línea” := NoSigMov; LinDiaGen.INSERT; EVALUATE(LinDiaGen.“Nº asiento”,FORMAT(Campos.Item(‘ASIEN’).Value)); EVALUATE(LinDiaGen.“Fecha registro”,FORMAT(Campos.Item(‘FECHA’).Value)); EVALUATE(LinDiaGen.“Nº cuenta”,COPYSTR(FORMAT(Campos.Item(‘SUBCTA’).Value),1,MAXSTRLEN(LinDiaGen.“Nº cuenta”))); //EVALUATE(LinDiaGen.“Cta. contrapartida”,COPYSTR(FORMAT(Campos.Item(‘CONTRA’).Value),1,MAXSTRLEN(LinDiaGen.“Cta. contrapartida”))); //IF LinDiaGen.“Cta. contrapartida” = ‘0’ THEN LinDiaGen.“Cta. contrapartida” := ‘’; EVALUATE(LinDiaGen.Descripción,COPYSTR(FORMAT(Campos.Item(‘CONCEPTO’).Value),1,MAXSTRLEN(LinDiaGen.Descripción))); LinDiaGen.“Nº documento externo” := FORMAT(Campos.Item(‘FACTURA’).Value); IF LinDiaGen.“Nº documento externo” = ‘0’ THEN LinDiaGen.“Nº documento externo” := ‘’; //LinDiaGen.VALIDATE(LinDiaGen.“Cód. divisa”, ‘PTS’); Imp := 0; txt := FORMAT(Campos.Item(‘euroDEBE’).Value); EVALUATE(Imp, txt); IF Imp = 0 THEN BEGIN EVALUATE(Imp, FORMAT(Campos.Item(‘eurohaber’).Value)); Imp := - Imp; END; //GESTIÓN EN PESETAS DEL EJERCICIO. IF Dir.UtilizaPesetas THEN BEGIN LinDiaGen.VALIDATE( LinDiaGen.“Cód. divisa”, Conf.“Cod. Peseta”); txt := FORMAT(Campos.Item(‘PTADEBE’).Value); EVALUATE(Imp, txt); IF Imp = 0 THEN BEGIN EVALUATE(Imp, FORMAT(Campos.Item(‘PTAHaber’).Value)); Imp := - Imp; END; END; LinDiaGen.VALIDATE(LinDiaGen.Importe, Imp); LinDiaGen.“Nº documento” := ‘IMPORT-’ + FORMAT(LinDiaGen.“Nº asiento”); EVALUATE(V,COPYSTR(LinDiaGen.“Nº cuenta”, 3,18)); CASE COPYSTR( LinDiaGen.“Nº cuenta”, 1,2) OF ‘40’,‘41’: BEGIN CASE COPYSTR(LinDiaGen.“Nº cuenta”, 1,2) OF ‘40’: LinDiaGen.“Nº cuenta” := ‘p’+ FORMAT(V); ‘41’: LinDiaGen.“Nº cuenta” := ‘a’+ FORMAT(V); END; LinDiaGen.“Tipo mov.” := LinDiaGen.“Tipo mov.”::Proveedor; Prov.GET(LinDiaGen.“Nº cuenta”); LinDiaGen.“Grupo contable” := Prov.“Grupo contable proveedor”; END; ‘43’,‘44’: BEGIN LinDiaGen.“Tipo mov.” := LinDiaGen.“Tipo mov.”::Cliente; CASE COPYSTR(LinDiaGen.“Nº cuenta”, 1,2) OF ‘43’: LinDiaGen.“Nº cuenta” := ‘c’+ FORMAT(V); ‘44’: LinDiaGen.“Nº cuenta” := ‘d’+ FORMAT(V); END; //LinDiaGen.VALIDATE(LinDiaGen.“Nº cuenta”); Clie.GET(LinDiaGen.“Nº cuenta”); LinDiaGen.“Grupo contable” := Clie.“Grupo contable cliente”; END; ‘57’: BEGIN LinDiaGen.“Tipo mov.” := LinDiaGen.“Tipo mov.”::Banco; LinDiaGen.“Nº cuenta” := FORMAT(V); Banc.GET( LinDiaGen.“Nº cuenta”); LinDiaGen.“Grupo contable” := Banc.“Grupo contable banco”; END; END; EVALUATE(LinDiaGen.“Cód. departamento”,COPYSTR(FORMAT(Campos.Item(‘DEPARTA’).Value),1,MAXSTRLEN(LinDiaGen.“Cód. departamento”))); EVALUATE(LinDiaGen.“Nº proyecto”, LinDiaGen.“Cód. departamento” + ‘.’ + COPYSTR(FORMAT(Campos.Item(‘clave’).Value),1,MAXSTRLEN(LinDiaGen.“Nº proyecto”))); //evaluate(LinDiaGen.“Nº proyecto”,COPYSTR(FORMAT(Campos.Item(‘DEPARTA’).Value),1,MAXSTRLEN( LinDiaGen.“Nº proyecto”))); IF LinDiaGen.“Tipo mov.” <> 0 THEN LinDiaGen.“Nº proyecto” := ‘’; IF LinDiaGen.“Nº proyecto” = ‘.’ THEN LinDiaGen.“Nº proyecto” := ‘’; IF LinDiaGen.“Nº proyecto” = LinDiaGen.“Cód. departamento” + ‘.’ THEN LinDiaGen.“Nº proyecto” := ‘’; CompruebaProyecto; IF LinDiaGen.Importe <> 0 THEN LinDiaGen.MODIFY ELSE LinDiaGen.DELETE; EjecutaSQL(T : Text[100];Tipo : Integer) Ventana.UPDATE(1,T); Ventana.UPDATE(2,’’); IF Tipo = 0 THEN sql2 := 'UPDATE ’ + Tablas[i] + ‘1 SET ’ + Tablas[i] + ‘1.[’ + T + ‘] = " " WHERE ( ’ + Tablas[i] + ‘1.[’ + T +’]) Is Null’ ELSE sql2 := 'UPDATE ’ + Tablas[i] + ‘1 SET ’ + Tablas[i] + ‘1.[’ + T + ‘] = 0 WHERE ’ + Tablas[i] + ‘1.[’ + T +’] Is Null’; BD.Execute(sql2); CreaTabla() Tbl := BD.CreateTableDef(Tablas[i]); Tbl.Connect (sql); Tbl.SourceTableName := Tablas[i]; Tbls.Append(Tbl); IF CompruebaSiExisteTabla(Tablas[i] + ‘1’) THEN BEGIN sql1 := 'DROP TABLE '+ Tablas[i] + ‘1’; BD.Execute(sql1); END; sql1 := 'SELECT ’ + Tablas[i] + '.* INTO ’ + Tablas[i] + '1 FROM ’ + Tablas[i]; BD.Execute(sql1); RS := BD.OpenRecordset( Tablas[i]+‘1’ ); ActualizadBase := TRUE; CompruebaSiExisteTabla(NomTabla : Text[100]) : Boolean Tbls := BD.TableDefs; FOR j := 0 TO Tbls.Count - 1 DO BEGIN xTbl := Tbls.Item(j); IF xTbl.Name = NomTabla THEN EXIT(TRUE); END; EXIT(FALSE);

Daliusk, Me to! I have found movenext and update very slow! I have tried different methods of performing update, but performance is poor with all. I am new to using ADO, and have been experimenting (with dBIV) as you can see below. What sort of problems have you had? Regards, Jon. e.g. VARS: Name DataType Subtype Length SQLStr Text 250 DSN Text 250 NoOfRecordsAffected Integer OBJdbconnection Automation ‘Microsoft ActiveX Data Objects 2.6 Library’.Connection OBJdbrecset Automation ‘Microsoft ActiveX Data Objects 2.6 Library’.Recordset OBJdbfields Automation ‘Microsoft ActiveX Data Objects 2.6 Library’.Fields OBJdbfield Automation ‘Microsoft ActiveX Data Objects 2.6 Library’.Field CODE: DSN:=‘ADOdata’; SQLStr:=‘SELECT * FROM DELIVERY ORDER BY SYS_TRANS’; CREATE(OBJdbconnection); OBJdbconnection.Open(DSN); CREATE(OBJdbrecset); OBJdbrecset.Open(SQLStr,OBJdbconnection,0,3);{CursorTypeEnum=0 efficient, but gives forward only} OBJdbrecset.MoveFirst; ProgressWindow.OPEN(‘Processing Delivery No. #1################’); IF NOT OBJdbrecset.EOF THEN REPEAT ProgressWindow.UPDATE(1,FORMAT(OBJdbrecset.Fields.Item(‘SYS_TRANS’).Value)); // {BY FAR FASTEST METHOD OF UPDATE THAT I HAVE TESTED, BUT STILL SLOW!}Update… SQLStr:=‘UPDATE DELIVERY SET POSTED=“Z” WHERE SYS_TRANS="’ +FORMAT(OBJdbrecset.Fields.Item(‘SYS_TRANS’).Value)+’" AND LOCATION="’+FORMAT(OBJdbrecset.Fields.Item(‘LOCATION’).Value)+ ‘"’; OBJdbconnection.Execute(SQLStr,NoOfRecordsAffected,128); // Alternatively allow ADO to build SQL…VERY SLOW! //OBJdbrecset.Update(‘POSTED’,‘Z’); // Same thing done in three lines even perhaps not suprisingly // even slower… //OBJdbfield:=OBJdbfields.Item(‘POSTED’); //OBJdbfield.Value:=‘Z’; //OBJdbrecset.Update; OBJdbrecset.MoveNext; UNTIL OBJdbrecset.EOF; OBJdbrecset.Close; OBJdbconnection.Close; ProgressWindow.CLOSE; CLEAR(OBJdbconnection); CLEAR(OBJdbrecset);