FIREBIRD - MiniGui Extended

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

LUIZFILHO
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2008 10:22
Localização: Joao Pessoa PB

FIREBIRD - MiniGui Extended

Mensagem por LUIZFILHO »

Prezados Colegas
Preciso de ajuda, pois através de um exemplo contido na pasta \MINIGUI\SAMPLES\BASIC\FIREBIRD, me acendeu o desejo de trabalhar com SQL. Este exemplo eu compilei e funciona beleza, criei uma tabela com o IBEXPERT, substitui no exemplo, deu tudo certo, mais chegou a um ponto que não consegui entender.
Preciso selecionar um determinado registro em uma tabela CADSERV.FDB e trazer todos os valores para o FORM.
Baseado no exemplo fiz o seguiente:
"cCPF" é uma variável que pego no grid quando escolho a opçao "Alterar"

Código: Selecionar todos

oConnection:Setsql("SELECT * FROM CADSERV WHERE CPF='"+cCPF+"'")
		
if !oConnection:Open()
  msgstop("Não foi possível conectar a Base de Dados")	    
endif
	
Load window FRM_SERVID
FRM_SERVID.TxCpf.value:=transform(cCpf,"@R 999.999.999-99")
		
FRM_SERVID.TxNome.VALUE:=oConnection:Fields["NOME"]:value  ---> (aqui me retorna o erro base/1068 argument error array access)
.
.
.

Quando trabalho com DBF faço o seguinte

Código: Selecionar todos

if !cadserv->(dbseek(cCPF))
  return .f.
endif
FRM_SERVID.TxNome.VALUE:=cadserv->nome     
.
.
.

Já pesquisei bastante e não cosegui, por issto estou recorrendo ao forum para ver se alguem com experiencia em SQL me ajuda a resolver esta questão.

Desde já Agradeço
Abraço a todos
Luiz
Editado pela última vez por Toledo em 08 Ago 2013 14:45, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

FIREBIRD - MINIGUI EXTENDED

Mensagem por alxsts »

Olá!

Aparentemente o problema não é o SQL. Seu select está sintaticamente correto.

O erro que está acusando indica que o select não está retornando linha nenhuma do banco de dados. A variável cCpf tem conteúdo na hora que que você monta o select? Existe o CPF informado na tabela alvo do select?

Analisando o teu código, apesar de pequeno, parece ter um erro de lógica: o certo é abrir a conexão e depois executar comandos contra o banco. Ficaria assim:

Código: Selecionar todos

if !oConnection:Open()
   msgstop("Não foi possível conectar a Base de Dados")	
endif

oConnection:Setsql("SELECT * FROM CADSERV WHERE CPF='"+cCPF+"'")

// Neste ponto, testar se veio algum resultado. Em caso afirmativo, prosseguir. Senão cancelar...

Load window FRM_SERVID
FRM_SERVID.TxCpf.value:=transform(cCpf,"@R 999.999.999-99")
De qualquer forma, o correto é, logo após executar um select, verificar se o mesmo retornou algum resultado. Não conheço Firebird nem sei qual lib você está usando para conectar mas, procure a respectiva ocumentação e verifique como fazer este teste.

Poste um trecho maior do teu código. Informe os includes e libs que está usando.
[]´s
Alexandre Santos (AlxSts)
luiz antonio da silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 161
Registrado em: 21 Nov 2006 22:12
Localização: serrana-sp

FIREBIRD - MINIGUI EXTENDED

Mensagem por luiz antonio da silva »

Olá LUIZ !

tente fazer a alteração abaixo.

Código: Selecionar todos

if !oConnection:Open()
   msgstop("Não foi possível conectar a Base de Dados")   
endif

oConnection:Setsql("SELECT * FROM CADSERV WHERE CPF='"+cCPF+"'")

// Neste ponto, testar se veio algum resultado. Em caso afirmativo, prosseguir. Senão cancelar...
if !oConnection:eof()
    Load window FRM_SERVID
    FRM_SERVID.TxCpf.value:=transform(cCpf,"@R 999.999.999-99")
    ......
else
   msginfo("CPF: "+cCPF+" não localizado !","Retorno")
endif
Luiz antonio.
HMG 3.4.4 - SQL SERVER - ORACLE
LUIZFILHO
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2008 10:22
Localização: Joao Pessoa PB

FIREBIRD - MiniGui Extended

Mensagem por LUIZFILHO »

Alexandre e Luiz Antonio, desde já agradeço pela a atenção, pelo que vejo, vocês tem conhecimento em SQL mais não trabalham com SGDB FIREBIRD, mais com esse conhecimento e a boa vontade sei que vão poder me ajudar, analisem o código abaixo:

Código: Selecionar todos

 *
 * Access a firebird database through ODBC
 *
 * Based on ODBC_2 sample included in MiniGui Extended distribution
 * Hugo Rozas M.
 * HMG Extended v1.9.98
 *
*/

#include 'minigui.ch'

Memvar fColor,bfrColor,bColor
static oConnection
Function Main
   set navigation extended
   
   
   oConnection = todbc():new('DRIVER=Firebird/InterBase(r) driver;UID=SYSDBA;PWD=masterkey;DBNAME=CADSERV.FDB;')
   oConnection:Open()
   
   *  set delete on
   *Set ToolTipBalloon On
   *set browsesync on
   set century on
   set date german
 
   
   Private fColor := { |x,CellRowIndex| if ( CellRowIndex/2 == int(CellRowIndex/2) , RGB( 0,0,255 ) , RGB( 0,255,0 ) ) }
   Private bColor := { |val,CellRowIndex| if ( CellRowIndex/2 == int(CellRowIndex/2) , { 222,222,222 } , { 255,255,255 } ) }
   Private bfrColor := {|| RGB(0,0,0)}, bbkColor := {|| RGB(255,255,255)}

   FOTO:="4.BMP"
  
   Load Window Frm_Princ
   Center Window Frm_Princ
   
   Frm_Princ.Maximize
   Frm_Princ.Lbl_Mensagens.Visible := .F.
   Activate Window Frm_Princ
   

Return
*-----------------------------------------------------------------
Procedure CadServid()
   
  *oConnection = todbc():new('DRIVER=Firebird/InterBase(r) driver;UID=SYSDBA;PWD=masterkey;DBNAME=CADSERV.FDB;')                            
  *oConnection:Open()
   
   Load Window Frm_CadPes
   *Carrega_Dados(1)
   Center Window Frm_CadPes
   
   Activate Window Frm_CadPes
Return
*-----------------------------------------------------------------
Procedure Carrega_Dados(N)

FRM_CADPES.GRID_1.Deleteallitems

oConnection:Setsql('SELECT CPF,NOME FROM CADSERV ORDER BY NOME')

	if !oConnection:Open()
		msgstop("Não foi possível conectar a Base de Dados")
	else
		for i= 1 to len( oConnection:aRecordset )
			FRM_CADPES.GRID_1.additem( oConnection:aRecordset[i] )
		next
		FRM_CADPES.GRID_1.value := n
	end
	oConnection:Close()
REturn
*-----------------------------------------------------------------
Procedure tESTE()
VCOD:="12345678900"
Str := "INSERT INTO CADSERV (CPF,NOME) VALUES ("+VCOD+","+"'JOAO VICTOR'"+")"
	MSGINFO(Str)			
    oConnection:Setsql( Str )
	if !oConnection:Open()
		msgstop("Não foi possivel fazer a operação")
	end
	oConnection:Close()	

RETURN
*-----------------------------------------------------------------
procedure Eventos_(n)
	local cCPF:="", cNOME:="",Str

	do case
	case n == 1 .or. n == 2
		if n = 2
			cCPF    := FRM_CADPES.GRID_1.CELL( FRM_CADPES.GRID_1.VALUE, 1 )
			cNOME   := FRM_CADPES.GRID_1.CELL( FRM_CADPES.GRID_1.VALUE, 2 )
		end
		
		oConnection:Setsql("SELECT * FROM CADSERV WHERE CPF='"+cCPF+"'")
				MSGINFO("SELECT CPF,NOME FROM CADSERV WHERE CPF='"+cCPF+"'")
		if !oConnection:Open()
		  msgstop("Não foi possível conectar a Base de Dados")	    
		endif
		Load window FRM_SERVID
		    MSGINFO(cCPF)
			FRM_SERVID.TxCpf.value:=transform(cCpf,"@R 999.999.999-99")
			*FRM_SERVID.TxNome.value:=cNome
	        FRM_SERVID.TxNome.VALUE:=oConnection:Fields["NOME"]:value //é aqui que da erro
     		title iif(n = 2,'Alterando Cadastro do Sevidor ','Incluindo nôvo Cadastro de Sevidor')
			*Font 'ms sans serif' size 8
			 *on key escape action form1a.button2.onclick
		
		FRM_SERVID.center
		activate window FRM_SERVID
			
	case n == 3
		Str := "DELETE FROM CADSERV WHERE CPF="+str(FRM_CADPES.grid_1.cell(FRM_CADPES.grid_1.value,1))
		if msgyesno('Deletar este registro? '+hb_osnewline()+FRM_CADPES.grid_1.cell(FRM_CADPES.grid_1.value,2),'Confirma')
			oConnection:Setsql( Str )
			if !oConnection:Open()
				msgstop("Não foi possivel deletar o registro")
			else
				n := FRM_CADPES.grid_1.value
				FRM_CADPES.grid_1.deleteitem( n )
				FRM_CADPES.grid_1.value := iif(n > 1, n-1, 1)
				Frm_CADPES.statusbar.item(1) := "Registro: "+;
					ltrim(str(Frm_CADPES.grid_1.value))+" of "+alltrim(str(Frm_CADPES.grid_1.itemcount))
			end
			oConnection:Close()
			Frm_CADPES.grid_1.setfocus
		end
	endcase
	Frm_CADPES.Grid_1.SetFocus()
return
*--------------------------------------------------------------------------------
procedure salva_dados(n) 
*--------------------------------------------------------------------------------
	local Str
*    MSGINFO(str(n,2))
	if n = 1
	
		*Str := "INSERT INTO CADSERV (CPF,NOME,DATA_NASCTO,EST_CIVIL,NATURALIDADE,NACIONALIDADE,SEXO,RACA_COR,ESCOLARIDADE,FORMACAO,IDENTIDADE,"+; 
        *        "ORGA_EMISSOR,UF_ORG_EMISSOR_RG,DT_EMISSAO_RG,PIS_PASEP,TITULO_ELEITOR,PAI,MAE,ENDERECO,NUMERO,CIDADE,BAIRRO,COMPLEMENTO,CEP,EMAIL)"+;
	    Str := "INSERT INTO CADSERV (CPF,NOME,DATA_NASCTO,EST_CIVIL)"+;	
    		" VALUES ('"+TIRAMASCARA_CHR(FRM_SERVID.TxCPF.VALUE)+;
                "','"+Alltrim(FRM_SERVID.TxNome.VALUE)+;
		        "','"+DTOC(FRM_SERVID.TxNascimento.VALUE)+;
		        "','"+Alltrim(Str(FRM_SERVID.Cb_EstCivil.VALUE))+;
				"')"
				/*"','"+Alltrim(FRM_SERVID.TxNaturalid.VALUE)+;
				"','"+Alltrim(Str(FRM_SERVID.Cb_Nacionalid.VALUE))+;
				"','"+Alltrim(Str(FRM_SERVID.Cb_Sexo.VALUE))+;
				"','"+Alltrim(Str(FRM_SERVID.Cb_RacaCor.VALUE))+;				
				"','"+"FRM_SERVID.Cb_Escolaridade.VALUE"+;
				"','"+"FRM_SERVID.Cb_Formacao.VALUE"+;
				"','"+"FRM_SERVID.TxIdentidade.VALUE"+;
				"','"+Alltrim(FRM_SERVID.TxOrgEmissor.VALUE)+;
				"','"+Alltrim(FRM_SERVID.TxUfEmiRg.VALUE)+;
				"','"+"FRM_SERVID.TxDtEmiRg.VALUE"+;				
				"','"+Alltrim(FRM_SERVID.TxPisPasep.VALUE)+;
				"','"+Strzero(val(FRM_SERVID.TxTitEleitor.VALUE),11)+;
				"','"+Alltrim(FRM_SERVID.TxNomePai.VALUE)+;
				"','"+Alltrim(FRM_SERVID.TxNomeMae.VALUE)+;
				"','"+Alltrim(FRM_SERVID.Txt_RuaAv.VALUE)+;
				"','"+"FRM_SERVID.Txt_Numero.VALUE"+;
				"','"+Alltrim(FRM_SERVID.Txt_Cidade.VALUE)+;
				"','"+Alltrim(FRM_SERVID.Txt_Bairro.VALUE)+;
				"','"+Alltrim(FRM_SERVID.Txt_Complemento.VALUE)+;
				"','"+Alltrim(FRM_SERVID.Txt_CEP.VALUE)+;
				"','"+Alltrim(FRM_SERVID.TxEmail.VALUE)+;
				"')"*/
				
		        
                msgstop( Str )
		      
	else
         	cCPF := "'"+Alltrim(FRM_SERVID.TxCPF.VALUE)+"'"
		Str := "UPDATE CADSERV SET NOME='"+Alltrim(FRM_SERVID.TxNome.VALUE)+"',"+;
		        " DATA_NASCTO='"+CTOD(FRM_SERVID.TxNascimento.VALUE) + "'," + ; 
		        " EST_CIVIL='" + Alltrim(Str(FRM_SERVID.Cb_EstCivil.VALUE)) + "'" + ;
				" NATURALIDADE='" + Alltrim(Str(FRM_SERVID.TxNauralid.VALUE)) + "'" + ;
				" NACIONALIDADE='" + Alltrim(Str(FRM_SERVID.Cb_Nacinalid.VALUE)) + "'" + ;
				" SEXO='" + Alltrim(Str(FRM_SERVID.Cb_Sexo.VALUE)) + "'" + ;
				" RACA_COR='" + Alltrim(Str(FRM_SERVID.Cb_RacaCor.VALUE)) + "'" + ;
				" ESCOLARIDADE='" + (FRM_SERVID.Cb_Escolaridade.VALUE) + "'" + ;
				" FORMACAO='" + (FRM_SERVID.Cb_Formacao.VALUE) + "'" + ;
				" IDENTIDADE='" + (FRM_SERVID.TxIdentidade.VALUE) + "'" + ;
				" ORGA_EMISSOR='" + Alltrim(FRM_SERVID.TxOrgEmissor.VALUE) + "'" + ;
				" UF_ORG_EMISSOR_RG='" + Alltrim(FRM_SERVID.TxUfEmiRg.VALUE) + "'" + ;
				" DT_EMISSAO_RG='" + CTOD(FRM_SERVID.TxDtEmiRg.VALUE) + "'" + ;
				" PIS_PASEP='" + Alltrim(FRM_SERVID.TxPisPasep.VALUE) + "'" + ;
				" TITULO_ELEITOR='" + Strzero(val(FRM_SERVID.TxTitEleitor.VALUE),11) + "'" + ;
				" PAI='" + Alltrim(FRM_SERVID.TxNomePai.VALUE) + "'" + ;
				" MAE='" + Alltrim(FRM_SERVID.TxNomeMae.VALUE) + "'" + ;
				" ENDERECO='" + Alltrim(FRM_SERVID.Txt_RuaAv.VALUE) + "'" + ;
				" NUMERO='" + FRM_SERVID.Txt_Numero.VALUE + "'" + ;
				" CIDADE='" + Alltrim(FRM_SERVID.Txt_Cidade.VALUE) + "'" + ;
				" BAIRRO='" + Alltrim(FRM_SERVID.Txt_Cidade.VALUE) + "'" + ;
				" COMPLEMENTO='" + Alltrim(FRM_SERVID.Txt_Complemento.VALUE) + "'" + ;
				" CEP='" + Alltrim(FRM_SERVID.Txt_CEP.VALUE) + "'" + ;
				" EMAIL='" + Alltrim(FRM_SERVID.TxEmail.VALUE) + "'" + ;
				" WHERE CPF =" + cCPF
				
	        //msgstop( Str )
	end

	oConnection:Setsql( Str )
	if !oConnection:Open()
		msgstop("Não foi possivel fazer a operação")
	end
	oConnection:Close()
	if n == 1
		Carrega_Dados( FRM_CADPES.GRID_1.itemcount+1 )
	else
		FRM_CADPES.GRID_1.CELL( FRM_CADPES.GRID_1.VALUE, 1 ) := Alltrim(FRM_SERVID.TxCPF.VALUE)
		FRM_CADPES.GRID_1.CELL( FRM_CADPES.GRID_1.VALUE, 2 ) := Alltrim(FRM_SERVID.TxNome.VALUE)
		
	end
	FRM_CADPES.statusbar.item(1) := "Register "+ltrim(str(FRM_CADPES.GRID_1.VALUE))+" de "+alltrim(str(FRM_CADPES.GRID_1.itemcount))
	FRM_SERVID.release
	
return		

*------------------------------------------------------------------
/*
*/
Function Confirmar_Saida()
       
	If MSGYesNo( "Confirma Saída do Sistema??" , "SCPP" )
	   Frm_Princ.Release
	EndIf
       
Return Nil
*-----------------------------------------------------------------
***************************************
Procedure TiraMascara_CHR(var)
	Local i		:= 0
        Local cVAR      := AllTrim( VAR )
	Local cNewVAR	:= ""

	For i := 1	 To Len( cVAR )
              
		cNewVAR += Iif(  IsDigit( Substr( cVAR , i , 1 ) )  , Substr( cVAR , i , 1 ) , ""  )

	Next

                VAR :=  cNewVAR

        Return VAR
Vejam que no inicio, trago os campos CPF E NOME para o GRID, quando chamo o evento "Editar" já trago do grid o FORM de apresentação dos dados, o CPF e o NOME. Então seleciono o registro equivalente aquele CPF na Tabela CADSERF.FDB e quero atribuir os valores dos demais campos(cerca de 15) às variáveis criadas, por exemplo:vamos supor que tenho 15 variáveis e quero atribuir a elas o valor dos campos equivalentes na tabela, ficaria assim:
Variável dDataNascimeno receber o valor do campo DATA_NASCIMENO do registro selecionado na tabela;
Variável cPai receber o valor do campo PAI do registro selecionado na tabela;
Variável cMae receber o valor do campo MAE do registro selecionado na tabela;
E assim sucessivamente.

No codigo acima(LINHA 104) tento atribuir à FRM_SERVID.TxNome.VALUE o valor do campo NOME da tabela e é aí que dá erro, talvez o comando esteja errado, pois peguei de outro exemplo.

Obsevem que não foi icluida nenhuma lib.
Abraço
Luiz
LUIZFILHO
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 15 Jul 2008 10:22
Localização: Joao Pessoa PB

FIREBIRD - MiniGui Extended

Mensagem por LUIZFILHO »

Pessoal
Depois de algumas pesquisas e vendo outros exemplos, descobri o que queria, ou seja, tirei minha dúvida. Vou continuar com o teste que estou fazendo de uma aplicação simples, e quando concluir vou postar esta aplicação para que quem se interessar em trabalhar com MINIGUI EXTENDED e FIREBIRD, já tenha um bom começo.
Suadações e Até breve

Luiz
Responder