× Linguagem de Programação ADVPL

Perguntas Um simples Loop que não funciona

Mais
10 anos 1 mês atrás #25482 por linx1010
Olá mestres do ADVPL

Estou começando hoje nessa nova linguagem, estou migrando do PHP e VBA para esse novo desafio

estou com uma duvida besta que é o seguinte, não consigo fazer o loop com os registros de uma tabela

meu codigo:

User Function listGrd(cItem)

local cMensagem
local nConta :=0

dbSelectArea("SG1")
dbsetorder(1)
dbseek(xFilial()+cItem)
MSGALERT(SG1->G1_COMP)
While SG1->G1_COD == cItem
nConta +=1
MsgAlert(nConta)
SG1->(dbskip())
end
return


Ele me mostra somente o primeiro registro e não entra no while, por que???

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 1 mês atrás #25495 por kanaamlrr
Respondido por kanaamlrr no tópico Um simples Loop que não funciona
Bom dia Leandro, tudo certo?

Cara, não entendi a sua necessidade nesse loop, porém de qualquer forma vou lhe passar umas dicas iniciais para esse tipo de estrutura.

Pelo que eu entendi, você está tentando mostrar todos os componentes do primeiro nível dessa estrutura de produtos certo?

Nesse caso, vamos as considerações:

1- O cItem deve conter o código do produto de preferência com o tamanho do campo, por exemplo
Meu campos de código tem tamanho 10, porém o código do meu produto é "100", deve-se utilizar algumas funções para ajustar esse tamanho, nesse caso poderia ser algo do tipo:
cItem := PadR(AllTrim(cItem),TamSx3("G1_COD")[1]

2 - Sempre que você executa um dbSeek, ele retorna verdadeiro ou falso dizendo se encontrou o registro ou não. Nesse caso não é necessário verificar pois a condição do While já irá validar a situação, porém em outros casos específicos é recomendável utilizar esse retorno.

3 - Via de regra, sempre utilize a condição do seu While da seguinte forma:
While SG1->(!Eof()) .AND. SG1->(G1_FILIAL+G1_COD) == xFilial("SG1")+cItem
   ....
   SG1->(dbSkip())
EndDo

A chave de comparação do loop sempre igual a chave de busca.

Acho que é basicamente isso.
Se possível, explique um pouco melhor o que você está tentando fazer.
Abraço e bem vindo ao mundo Protheus!

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 1 mês atrás #25504 por linx1010
Respondido por linx1010 no tópico Um simples Loop que não funciona
Perdão pela falta de clareza, eu alterei meu código de acordo com suas instruções
USER FUNCTION CTGRADE(cItem)
	local nTot :=0
	local cTexto :=""
	cItem := PadR(AllTrim(cItem),TamSx3("G1_COD")[1])	
	dbselectarea("SG1")
	dbsetorder(1)
	//while SG1->G1_COD == cItem
	While SG1->(!Eof()) .AND. SG1->(G1_FILIAL+G1_COD) == xFilial()+cItem
		cTexto += SG1->G1_COMP + chr(10)
		nTot ++
		SG1->(dbskip())
	EndDo
	MSGALERT (cTexto)
	MSGALERT (nTot)
RETURN NIL

bem nao rodou como eu espera, o retorno dele deveria ser um alert com os componentes e outro alert com a quantidade total
este no momento é de estudo (somente uma mesa de testes) mas terei que montar um parecido para informa ao usuário os pedidos
que ele deve faturar em uma mesma nota
Obrigado pela rapida resposta

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 1 mês atrás #25510 por kanaamlrr
Respondido por kanaamlrr no tópico Um simples Loop que não funciona
Então leandro, no caso de buscar estruturas na SG1, é recomendável que se utilize uma função recursiva, assim você consegue garantir que irá trazer a estrutura inteira em vários níveis.

Nesse caso ele trouxe apenas do primeiro nível da estrutura né?

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 1 mês atrás - 10 anos 1 mês atrás #25512 por linx1010
Respondido por linx1010 no tópico Um simples Loop que não funciona
Sim, mas a busca será somente no primeiro nível mesmo, pois temos dois tipos de produtos, os kits e os conjuntos, os kits são compostos de mais de dois itens, os conjuntos até 2 itens (isso devido a algumas regras de preço).
Isso ajudaria o vendedor na hora do desconto sem ter a necessidade de abrir o produto na tela de vendas.

Ele acaba me trazendo somente o primeiro item do primeiro nível, (a partir do segundo em muitos casos já estaria a nível de M.P.
Ultima edição: 10 anos 1 mês atrás por linx1010. Razão: Complemento

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 1 mês atrás #25514 por kanaamlrr
Respondido por kanaamlrr no tópico Um simples Loop que não funciona
Entendi...
Teria como você mandar um exemplo de uma estrutura que está preenchida (sem quantidades, apenas um exemplo de codigos) para poder entender melhor o que está rolando no seu Loop?

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.115 segundos
Joomla templates by a4joomla