Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Como inluir registro numa grid?
Message
From
09/06/2002 23:17:59
 
 
To
General information
Forum:
Visual FoxPro
Category:
Databases,Tables, Views, Indexing and SQL syntax
Title:
Como inluir registro numa grid?
Miscellaneous
Thread ID:
00666424
Message ID:
00666424
Views:
68
Walney falou:

quero aprender como poderei trabalhar com um form e uma grid de modo que poderei incluir produtos nesta grid referente a este forme que a tabela venda, entende ? é para um PDV...


Geraldo falou:
Walney, preferi criar uma nova thread pra falarmos da sua pergunta, porque parece que estamos nos distanciando do tema "Afinal, quem usa FoxPro no Brasil?"

Pelo que "saquei" você anda tentando incluir dados em grid - isso não se faz mesmo. Na grid nativa do VFP não se inclui dados - os dados são incluídos em tabelas e essas podem ser fonte de dados das grids. Dessa forma, você deve incluir os dados na tabela e dar REFRESH na grid pra que os dados incluídos apareçam nela. Existem outros tipos de grids que permitem a inclusão nela mesma, mas não vou falar delas agora.

Criei um exemplo bastante simples de ilustrando o que falei - vou enviar o exemplo pro seu e-mail particular.

No exemplo que criei não utilizo DataEnvironment, nem USE, nem SET ORDER - isso tudo são técnicas que estou abandonando - estou adotando a técnica SELECT-SQL para manipulação dos dados.

São características do exemplo que estou te enviando:

1 - os dados são manipulados por SELECT-SQL
2 - auxílio de TRANSAÇÕES nas operações de INCLUSÃO e EXCLUSÃO
3 - utilização do evento ERROR dos botões INCLUIR e EXCLUIR para executar os ROLLBACKs necessários e informar ao usuário sobre a ocorrência do erro
4 - utilização de uma técnica interessante pra se criar código auto-incremento



O form-exemplo contém: 1 TEXTBOX, 1 BOTÃO INCLUIR, 1 BOTÃO EXCLUIR e 1 GRID.
Contém, também, um Banco de Dados que contém, na StoredProcedure, uma procedure pra se criar código auto-incremento.

No TextBox1.InteractiveChange contém este código:
Local lcNome

lcNome = Alltrim(this.Value) + "%"

this.Parent.Grid1.RecordSource = "" && comente esta linha e veja o resultado
Select i_codigo, c_nome from Dados\Nomes where Upper(c_nome) like Upper(lcNome) order by c_nome into cursor curNomes
this.Parent.Grid1.RecordSource = "curNomes" && comente esta linha e veja o resultado
this.Parent.Grid1.AfterRowColChange 

No BotaoIncluir.Click contém este código:
Local lcNome, laVerif[1]
***
lcNome = Alltrim(this.Parent.Parent.Text1.Value)
if Empty(lcNome) && não incluir registro em branco
  Return 
EndIf 
***
Select i_codigo from Dados\Nomes where c_nome == lcNome into array laVerif
if _tally > 0 && não incluir nome que já existe - na sua realidade provavelmente você precisará aceitar nomes iguais
  Return 
EndIf 
***
Begin Transaction 
  Insert into Dados\Nomes (c_nome) values (lcNome)
End Transaction 
this.Parent.Parent.Text1.InteractiveChange && pra refazer a busca pra que o nome excluído não apareça no cursor

No BotaoIncluir.Error contém este código:
DO while Txnlevel() > 0 
  RollBack && enquanto houver uma transação pendente executará rollback
EndDo 
MessageBox("Ocorreu um problema que impossibilitou a execução desta operação", 16, "Excessão")

No BotaoExcluir.Click contém este código:
Local lcTexto

if (!Used("curNomes")) or (Empty(thisform.Codigo))
  Return 
EndIf 
***
lcTexto = "Confirma a execlusão de " + Alltrim(curNomes.c_nome)
if MessageBox(lcTexto, 4+32, "Confirmação") = 6
  Begin Transaction 
    Delete From Dados\Nomes where i_codigo = thisform.Codigo 
  End Transaction 
  this.Parent.Parent.Text1.InteractiveChange && pra refazer a busca pra que o nome excluído não apareça no cursor
EndIf 

No BotaoExcluir.Error contém este código:
DO while Txnlevel() > 0 
  RollBack && enquanto houver uma transação pendente executará rollback
EndDo 
MessageBox("Ocorreu um problema que impossibilitou a execução desta operação", 16, "Excessão")

Na Grid1.AfterRowColChange contém este código:
Observe que é necessário criar uma propriedade chamada CODIGO no form.
thisform.Codigo = curNomes.I_Codigo

this.SetAll("DynamicBackColor",  "IIF(thisform.Codigo = curNomes.I_Codigo, RGB(0,0,128), RGB(255,255,255))","Column")
this.SetAll("DynamicForeColor" , "IIF(thisform.Codigo = curNomes.I_Codigo, RGB(255,255,255), RGB(0,0,0))","Column")
this.Refresh 

Na StoredProcedure do Banco de Dados contém este código:
Observe que no DEFAULT VALUE do campo código da tabela NOMES coloquei: mkkey("Nomes.I_Codigo") que é a chamada pra função abaixo.
function MkKey(tkKeyCtr) 
  * Walney, esta é uma das melhores técnicas pra criar código incremental
  local lkKeyCtr, laCtr[1], lcDel
  lcDel = Set("Deleted")
  Set Deleted Off 
  ***
  do while .t.
	If not Used( "KeyCtr" )
	  Use Dados\KeyCtr in 0 Shared Again
	  If TxnLevel() == 0
	    CursorSetProp("Buffering", 1, "KeyCtr")
	  Endif
	Endif
	m.lkKeyCtr = padr(m.tkKeyCtr, lenc(KeyCtr.kKeyCtr))
	select nCtr from Dados\KeyCtr where kKeyCtr = m.lkKeyCtr into array laCtr
	if _tally = 0
	  Local lcTabNova, lcCampoNovo, aProxCod[1], lcTexto
	  ***
	  lcTabNova   = Alltrim(Substr(tkKeyCtr, 1, At(".", tkKeyCtr) - 1)) && até o ponto
      lcCampoNovo = Alltrim(Substr(tkKeyCtr, At(".", tkKeyCtr) + 1))
      Select Max(&lcCampoNovo) from Dados\&lcTabNova into array aProxCod
      aProxCod(1) = Iif(_tally = 0, 1, aProxCod(1) + 1)
	  insert into Dados\KeyCtr (kKeyCtr, nCtr) values (m.lkKeyCtr, aProxCod(1))
	  loop
	EndIf 
	update Dados\KeyCtr set nCtr = laCtr[1] + 1 where (kKeyCtr = m.lkKeyCtr) and (nCtr = laCtr[1])
	if _tally = 0
	  use in KeyCtr
	  loop
	endif
	exit
  enddo
  If Used("KeyCtr")
    use in KeyCtr
  EndIf 
  Set Deleted &lcDel
  return laCtr[1]
EndFunc && function MkKey( tkKeyCtr )
Next
Reply
Map
View

Click here to load this message in the networking platform