Galera, encontrei aqui no fórum mesmo uma função para consultar dados em bd firebird. configurei os drivers odbc e para consulta das tabelas está funionando tranquilamente. gostaria de saber se é possivel executar operações de incluir, editar e excluir dados contidos neste banco de dados com esta função. Se puderem exibir algum exemplo, ficarei agradecido pois sou um pouco leigo em conexão odbc e preciso integrar dois bancos diferentes firebird e progress. Dei uma garimpada na net mais não obtive muito sucesso. abaixo a função que estou utilizando: Código: /* Variaveis para uso do ODBC */ Def var ObjRecordSet as com-handle no-undo. Def var ObjConnection as com-handle no-undo. Def var ObjCommand as com-handle no-undo. Def var ODBC-DSN as character no-undo. Def var ODBC-SERVER as character no-undo. Def var ODBC-USERID as character no-undo. Def var ODBC-PASSWD as character no-undo. Def var ODBC-QUERY as character format '300' no-undo. Def var ODBC-STATUS as character no-undo. Def var ODBC-RECCOUNT as integer no-undo. Def var ODBC-NULL as character no-undo. Def var ODBC-CURSOR as integer no-undo. def var l-ok as log initial no. /* Variaveis para uso do ODBC */ Def var ObjRecordSet as com-handle no-undo. Def var ObjConnection as com-handle no-undo. Def var ObjCommand as com-handle no-undo. Def var ODBC-DSN as character no-undo. Def var ODBC-SERVER as character no-undo. Def var ODBC-USERID as character no-undo. Def var ODBC-PASSWD as character no-undo. Def var ODBC-QUERY as character format '300' no-undo. Def var ODBC-STATUS as character no-undo. Def var ODBC-RECCOUNT as integer no-undo. Def var ODBC-NULL as character no-undo. Def var ODBC-CURSOR as integer no-undo. def var l-ok as log initial no. /*definindo a tabela temporária*/ def temp-table tt-estoque-paf field coditemzaal as INT field aliqicms as CHAR field coditemEMS as CHAR FORMAT "x(20)" field descricao as CHAR FORMAT "x(60)". /*atribuindo falso a variavel l-ok*/ l-ok = FALSE. /*executando a função e recebendo o parametro se conectou ou não*/ RUN pi-conecta-odbc (INPUT-OUTPUT l-ok). /*se a variavel l-ok for igual a falso exibe msg ao usuario de conexão não efetuada*/ IF l-ok <> TRUE THEN DO: MESSAGE "Não foi possível fazer a conexão com o Firebird!" SKIP "Favor tentar saindo do programa e entrando novamente." VIEW-AS ALERT-BOX WARNING TITLE " ATENÇÃO". RETURN NO-APPLY. END. /*procedure de conexão com o banco de dados*/ PROCEDURE pi-conecta-odbc: /*definindo varivel de entrada e saida de parametro*/ DEF INPUT-OUTPUT PARAMETER p-ok AS LOG. /*se a tabela temporária estiver vazia*/ empty temp-table tt-estoque-paf. /* cria o bojeto de conexão para o firebird */ Create "ADODB.Connection" ObjConnection. /* criando um recordset object ready para retornar os dados */ Create "ADODB.RecordSet" ObjRecordSet. /* Criando um comando no objeto para envio do sql instanciado*/ Create "ADODB.Command" ObjCommand. /* Carregando os dados da conexão com o banco*/ /* mm/dd/yyyy */ Assign /* O nome da conexão instanciada no ODBC DSN */ ODBC-DSN = "bdfirebird" /* O ip do servidor ou host onde está instanciado o banco*/ ODBC-SERVER = "192.168.5.25" /* O usuario de acesso ao banco de dados Firebird */ ODBC-USERID = "SYSDBA" /* a senha de acesso */ ODBC-PASSWD = "masterkey" ODBC-QUERY = " select *" ODBC-QUERY = ODBC-QUERY + " From estoque". /* Abrindo a conexão com as informações requeridas no ODBC*/ ObjConnection:Open ( "data source=" + ODBC-DSN + ";server=" + ODBC-SERVER, ODBC-USERID, ODBC-PASSWD, 0 ) no-error. /* Inicializando o arquivo */ /* Tratando os erros */ If ( error-status:num-messages > 0 ) then DO: MESSAGE "Falha na conexão!" SKIP "Favor configurar corretamente o Drive ODBC." VIEW-AS ALERT-BOX ERROR TITLE " ERRO". ODBC-STATUS = "Error: Could not establish connection.". END. Else DO: Assign ObjCommand:ActiveConnection = ObjConnection ObjCommand:CommandText = ODBC-QUERY ObjCommand:CommandType = 1 /* adCmdText */ ObjConnection:CursorLocation = 3 /* adUseClient */ ObjRecordSet:CursorType = 3 /* adOpenStatic */ ObjRecordSet = ObjCommand:Execute ( output ODBC-NULL, "", 32 ) ODBC-RECCOUNT = ObjRecordSet:RecordCount. /* Existe alguma linha (row) retornada ? */ If ( ODBC-RECCOUNT > 0 ) and not ( ODBC-RECCOUNT = ? ) then Do: ObjRecordSet:MoveFirst no-error. Do while ODBC-CURSOR < ODBC-RECCOUNT: /* Apresentar os dados da consulta (ou criar um progresso temp-table para uso futuro) */ /* Mostrar ObjRecordSet: Campos ("nome"): Valor formato "x (20)". */ /*incluindo dados na tabela temporária*/ CREATE tt-estoque-paf. ASSIGN tt-estoque-paf.coditemzaal = ObjRecordSet:Fields ("codmer" ):value tt-estoque-paf.aliqicms = ObjRecordSet:Fields ("aliqicms" ):value tt-estoque-paf.coditemEMS = ObjRecordSet:Fields ("referencia" ):value tt-estoque-paf.descricao = ObjRecordSet:Fields ("desfis" ):value. /*encrementando para passar para proximo registro*/ Assign ODBC-CURSOR = ODBC-CURSOR + 1. ObjRecordSet:MoveNext no-error. p-ok = TRUE. End. /* Recuperada uma linha única de dados*/ End. /* Recuperadas todas as linhas de dados */ ELSE DO: Assign ODBC-STATUS = "No records found.". MESSAGE "Nenhum registro encontrado!" VIEW-AS ALERT-BOX WARNING TITLE "Atenção ()". END. /* Feche a conexão DAO */ ObjConnection:Close no-error. End. /* fim da conexão aberta corretamente */ /* liberando objetos da memória */ Release object ObjConnection no-error. Release object ObjCommand no-error. Release object ObjRecordSet no-error. Assign ObjConnection = ? ObjCommand = ? ObjRecordSet = ?. END PROCEDURE. /*exibindo dados consultados*/ FOR EACH tt-estoque-paf NO-LOCK: DISP tt-estoque-paf WITH WIDTH 150. END.