Jump to content
Apolo

PHC - Programação em XBASE

Recommended Posts

Camarao69

Boa tarde

Precisava de uma ajudinha SFF, preciso que o phc não permita gravar um determinado dossier se já existir um criado para o mesmo cliente ou seja , so quero que o dossier tenha um registo por cliente.

Obrigado

Share this post


Link to post
Share on other sites
pc.cesar

Boas,

deve criar uma regra da framework

tabela BO

- colocar o visto em "A expressão é um programa"

- colocar o visto em "avisa mas deixa gravar" ou " não pode Gravar"

****************************** codigo ******* nao validei

local xbono, xboestab

xbono = astr(bo.no)
xboestab = astr(bo.estab)


** Preparar a instrução de Select
Text to m.cSelbo noshow textmerge
select bo.ndos, bo.no, bo.estab, count(bo.no) registos
from bo where bo.ndos=2
and bo.no='<< astr(xbono) >>'
and bo.estab='<< astr(xboestab) >>'
group by bo.ndos, bo.no, bo.estab
having count(bo.no)>=1
EndText

** Criar o Cursor
if u_sqlexec(m.cSelbo,"meuPC")
 If reccount("meuPC") >=1
	 msg("ja existe um documento para este cliente")
	 return .f.
	 endif
endif

***************************************************************

se tiver duvidas o meu mail é pc.cesar [at] gmail.com

Boa tarde

Precisava de uma ajudinha SFF, preciso que o phc não permita gravar um determinado dossier se já existir um criado para o mesmo cliente ou seja , so quero que o dossier tenha um registo por cliente.

Obrigado

Edited by apocsantos
tag code
  • Vote 1

Share this post


Link to post
Share on other sites
Camarao69

Boas,

deve criar uma regra da framework

tabela BO

- colocar o visto em "A expressão é um programa"

- colocar o visto em "avisa mas deixa gravar" ou " não pode Gravar"

****************************** codigo ******* nao validei

local xbono, xboestab

xbono = astr(bo.no)

xboestab = astr(bo.estab)

** Preparar a instrução de Select

Text to m.cSelbo noshow textmerge

select bo.ndos, bo.no, bo.estab, count(bo.no) registos

from bo where bo.ndos=2

and bo.no='<< astr(xbono) >>'

and bo.estab='<< astr(xboestab) >>'

group by bo.ndos, bo.no, bo.estab

having count(bo.no)>=1

EndText

** Criar o Cursor

if u_sqlexec(m.cSelbo,"meuPC")

If reccount("meuPC") >=1

msg("ja existe um documento para este cliente")

return .f.

endif

endif

***************************************************************

se tiver duvidas o meu mail é pc.cesar [at] gmail.com

Muito Obrigado César, como defino so um dossier neste caso com o numero de dossier ”3” o nome de dossier é “ Preços de Cliente”

Cumps

Marcos

Edited by Camarao69

Share this post


Link to post
Share on other sites
maxx77

Viva,

Tenho uma tabela sql com artigo, operações, componentes.

Precisava de importar isto para o phc por forma a ter uma ficha técnica criada.

Alguem me pode dar umas luzes sobre isto?

obrigado

Share this post


Link to post
Share on other sites
pc.cesar

Depende do circuito que pretendes montar e da versão PHC

Qual a versão PHC

Qual o circuito que pretendes montar ?

gerar ordens de fabrico no PHC

ter apenas a ficha tecnica

ter historico das fichas tecnicas ???

A tabela SQL é PHC ou outra BD?

Share this post


Link to post
Share on other sites
maxx77

PHC 15, quero apenas criar a ficha tecnica a partir de uma tabela sql (phc).

o meu problema é não conhecer as tabelas PHC do manufactor onde são gravadas as fichas técnicas.

Share this post


Link to post
Share on other sites
pc.cesar

Quando pergundo qual a versão pretendo saber se é corporate, advanced ou enterprise

Se tem manufactor, não percebo a necessidade de ficha técnica do artigo no phc!!!

o manufactor é muito mais complexo de trabalhar do que o PHC...

Explique em concreto a necessidade. para analizar.

Para utilizar a informação de modo mais confidencial utilize o meu email pc.cesar[at]gmail.com

Share this post


Link to post
Share on other sites
Camarao69

Bom dia

Alguem me pode dar uma ajuda SFF ?

Preciso de uma regra que me avise se um artigo não tiver stock suficiente para satisfazer o cliente ?

Basicamente o que eu preciso contem esta formula :

if bi.qtt-bi.qtt2>st.stock-st.qttcli

Preciso que ele me avise mas deixe gravar e se possivel que me mostre numa tabela para quem está pendente e quantas unidades

Obrigado.

Edited by Camarao69

Share this post


Link to post
Share on other sites
pc.cesar

Boas, não conhecendo o circuito real, deve experimentar o seguinte:

** Criar Regra
** a Expressão é um programa = SIM
** Avisa violação mas deixa Gravar
**


* -- Documento : Encomenda de Cliente
* -- Alerta Artigos Abaixo do Stock Minimo tendo em conta Encomenda de Ciente / Fornecedor e Entregas
* -- pc.cesar@
* -- Data 16-08-2009
* -- PHC Enterprise + Manufactor
* -- Base de dados: Ambitestes
* -- Código não testado em ambiente real, pode necessitar de ser ajustar á medida do cliente
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
select bo
if (bo.ndos=2) *** Dossier Interno: Encomenda de Cliente

select bi
scan
if get_stref(bi.ref,"ref,design, STOCK, QTTCLI, QTTFOR, stmin, stmax")
		u_stokreal = tempst.STOCK
		u_reserva =tempst.QTTCLI
		u_encforn =tempst.QTTFOR
		u_bistock = bi.qtt

		 u_dif = str((((tempst.stock-QTTCLI) + tempst.QTTFOR) - (bi.qtt-bi.qtt2)),3)

		   *** bi.qtt-bi.qtt2>c2.stock-c1.reserva


if (val(u_dif)<= tempst.stmin)

m.mErros =[]
m.mErros = tempst.ref
m.mErros = m.mErros + [  |   Descrição: ]+ tempst.design
m.mErros = m.mErros + [  |   QTT doc: ] + alltrim(str(bi.qtt))
m.mErros = m.mErros + [  |   Stock minimo: ]+ str(tempst.stmin)
=aadderros(m.mErros)

else
**msg("xx")
endif
endif

endscan


else
return .t.
endif
endif

Share this post


Link to post
Share on other sites
Camarao69

Ola Cesar muito obrigado pela resposta

O meu PHC é o Corporate

Eu so quero que ele me avise mediante a formula bi.qtt-bi.qtt2>st.stock-st.qttcli

está me adar um erro

Erro na Compilação:

endif

Error in line 36: An IF | ELSE | ENDIF statement is missing.

Obrigado

Edited by Camarao69

Share this post


Link to post
Share on other sites
Camarao69

Boa tarde Cesar

Quando lanço uma encomenda da me a seguinte mensagem

Regra com nº interno : 229

Código: 12

Linha: 12

Mensagem 1: Variable 'QTTCLI' is not found.

Mensagem 2:

Local: XRULE22920150409172329

Chamada:

MAINCORP

MAINMAIN

SBO.BOK1.OKBUTTOMDEF1.CLICK

SBO.BOCLASS1.GRAVARDOSSIER

SBO.CHECKRULE

PRGRUN

XRULE22920150409172329

ON...

Ja agora eu nao sei se esta inserida na formula mas eu não queria que ele contasse com os encomedados a fornecedor.

Edited by Camarao69

Share this post


Link to post
Share on other sites
pc.cesar

SUBSTITUIR

u_dif = str((((tempst.stock-QTTCLI) + tempst.QTTFOR) - (bi.qtt-bi.qtt2)),3)

POR

u_dif = str((((tempst.stock-tempst.QTTCLI) + tempst.QTTFOR) - (bi.qtt-bi.qtt2)),3)

Share this post


Link to post
Share on other sites
Camarao69

Sr Cesar obrigado por responder a minha questão

mas náo funcionou, ele grava e não me diz nada,

Share this post


Link to post
Share on other sites
pc.cesar

envio o codigo testado

*********************
* -- Documento : Encomenda de Cliente
* -- Alerta Artigos Abaixo do Stock Minimo tendo em conta Encomenda de Ciente / Fornecedor e Entregas
* -- pc.cesar@
* -- Data 16-08-2009
* -- PHC Enterprise + Manufactor
* -- Base de dados: Ambitestes
* -- Código não testado em ambiente real, pode necessitar de ser ajustar á medida do cliente
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
select bo
if bo.ndos<>1

 return .t.
else

select bi
scan
if get_stref(bi.ref,"ref,design, STOCK, QTTCLI, QTTFOR, stmin, stmax")
u_stokreal = tempst.STOCK
u_reserva =tempst.QTTCLI
u_encforn =tempst.QTTFOR
u_bistock = bi.qtt
endif
	   u_dif = str((((tempst.stock-tempst.QTTCLI) ) - (bi.qtt-bi.qtt2)),3)

			 *** bi.qtt-bi.qtt2>c2.stock-c1.reserva


if (val(u_dif)<= tempst.stmin)
m.mErros =[]
m.mErros = tempst.ref
m.mErros = m.mErros + [  |  ]+ alltrim(tempst.design)
m.mErros = m.mErros + [  |  QTT Previsto: ] +TRANSFORM( u_dif ,'999999.999')
m.mErros = m.mErros + [  |  Stock min.: ] + alltrim(str(tempst.stmin, 9, 3))
=aadderros(m.mErros)
			else
msg("xx")
endif
endscan



**mostrar erros**
IF USED("a_erros") And RECCOUNT("a_erros")>0
deactform()
timeouton()
m.mCancelAnalise = .T.

DECLARE list_tit(1),list_cam(1),list_tam(1),list_pic(1)
list_tit(1)="Descrição"
list_cam(1)="a_erros.descricao"
list_pic(1)="MEMO"
list_tam(1)=8*80

docomando("Do Form browlist With 'Erros encontrados','a_erros'")
USE IN a_erros
ENDIF


endif

Share this post


Link to post
Share on other sites
Camarao69

Bom dia

Está me a dar o seguinte erro

Regra com nº interno : 232

Código: 36

Mensagem 1: Command contains unrecognized phrase/keyword.

Mensagem 2:

Local: PRGRUN

Chamada:

MAINCORP

MAINMAIN

SBO.BOK1.OKBUTTOMDEF1.CLICK

SBO.BOCLASS1.GRAVARDOSSIER

SBO.CHECKRULE

PRGRUN

ON...

Eu ontem mandei lhe um email não sei se viu ?

Share this post


Link to post
Share on other sites
NelsonPaiva

Boas tardes.

Este tópico parece-me geral de PHC por isso vou colocar aqui a minha dúvida.

Estou a tentar criar um código se destina a criar um novo dossier e copiando alguns dados do dossier em que estou. Estou no dossier "dossier1" e ao clicar no botão ele vai criar um outro dossier "dossier2" (não o mesmo tipo de dossier) copiando para lá certos campos.

No entanto quando clico no botão aparece-me este erro: Mensagem 1: Table buffer for alias "BI" contains uncommitted changes.

O PHC vai para o dossier que deveria ser criado mas sem qualquer tipo de informação e não é criado qualquer dossier.

No entanto este mesmo procedimento se for realizado estando no dossier "Outrodossier1" e clicando no botão para criar o dossier "Outrodossier2" funciona sem qualquer problema (mudando apenas os números do dossier no código).

Alguém sabe o que poderei estar a fazer de errado? De onde surge este tipo de erro? Tentei pesquisar o erro mas não percebi como o resolver.

Share this post


Link to post
Share on other sites
pc.cesar

para entender a mensagem "Table buffer for alias "BI" contains uncommitted changes."

Buffering, é uma forma de proteger os dados durante operações com dados (update ou delete por exemplo). Quando se coloca um registo em buffering, o registo é copiado para a memória ou para o disco.

O registo original continua intacto e pode ser consultado por outros utilizadores em simultâneo. Quando se tenta actualizar (update) ou eliminar (delete) o registo, o registo é preso (lock), é verificado se não foram feitas alterações por outros utilizadores e são escritas as alterações feitas ao registo.

Quando em modo buffering se fazem alterações a registos de um cursor, esses registos ficam marcados como alterados. Enquanto não for feito o update os registos continuam marcados e não se podem fazer alguns comandos a registos que se encontram neste estado.

Por exemplo, não é recomendável fazer um u_requery a uma tabela que tem registos alterados em buffering e que ainda não foram gravados na tabela de origem, se for feito pode dar origem ao erro descrito. A solução passa por gravar ou cancelar as alterações feitas aos registos, ou seja, fazer um u_tabupdate (ou tableupdate) para gravar as alterações feitas ou fazer um TableRevert para cancelar as alterações feitas.

fecha("mbocursor")
			fecha("mbo2cursor")
			fecha("mbicursor")
			fecha("mbicursor2")

			* usar tabelas de dossiers
			do dbfusebo
			do dbfusebo2
			do dbfusebi

			* Utilizar a configuração do tipo de dossier nº1
			do tsread with "",1

			* criar os cursores mbocursor, mbo2cursor, mbicursor e mbicursor2 vazios
			create cursor mbocursor (no n(10), estab n(3), memissao c(10),fref c(20))
			u_sqlexec([select * from bo2 (nolock) where 1=0],[mbo2cursor])
			u_sqlexec([select * from bi (nolock) where 1=0],[mbicursor])
			u_sqlexec([select * from bi2 (nolock) where 1=0],[mbicursor2])

			* limpar os cursores
			select mbocursor
			delete for .t.
			append blank
			select mbicursor
			delete for .t.
			select mbo2cursor
			delete for .t.
			select mbicursor2
			delete for .t.

			* preencher alguns campos do cabeçalho (mbocursor)
			select mbocursor
			replace mbocursor.no with 1
			replace mbocursor.estab with 0
			replace mbocursor.memissao with 'EURO'
			replace mbocursor.fref with 'A001'

			* criar uma linha no dossier com a referência 'A001'
			select mbicursor
			append blank
			replace mbicursor.ref with 'A001'

			* preenche o campo preço de venda (bi.edebito) da linha do artigo:
			replace mbicursor.edebito with 1500

			* preenche quantidade do artigo (bi.qtt):
			replace mbicursor.qtt with 5

			* preenche o campo Nº subtipo (bi.stipo) da linha do dossier:
			replace mbicursor.stipo with 1

			* totaliza a linha do artigo:
			do u_bottdeb with 'mbicursor'

			* cria o dossier 'Encomenda a Cliente' isto tendo em conta que a configuração de encomenda a cliente
			* corresponde ao nº1 definido na tabela de configurações de dossiers internos (TS).
			if not criabobi(1,'mbicursor','mbocursor','mbo2cursor',.f.,.f.,DATE(),.f.)
			mensagem('Erro a gravar dossier','DIRECTA')
			return
			endif

			* Verifica se existem eventos "Ao Introduzir" definidos para o ecrã de dossiers (SBO)
			Do eventosexe with "SBO","INTRODUZIR"

Versões em que foi testado: 2008

Nota: Os dossiers não devem utilizar equipamentos, compostos, lotes, grelhas, projecto, promoções e descontos quantidade (JIT), ecovalor.

Edited by Rui Carlos
tag code

Share this post


Link to post
Share on other sites
NelsonPaiva

para entender a mensagem "Table buffer for alias "BI" contains uncommitted changes."

.....

Obrigado pela ajuda.

Eu não estava a utilizar produtos compostos, no entanto tinha essa opção ativa na configuração dos dossiers e vinha daí o problema.

Lá se acabou por fazer luz.

Neste momento estou com outro problema:

Tenho este código que é executado atraves de uma tecla que é para introduzir algumas linhas num dossier de modo a que seja mais rápido para os utilizadores e não tenham de andar a colocar uma a uma. Foi o modo que encontrei de colocar linhas por defeito ao ser criado um dossier, embora não seja totalmente automático.

As linhas aparecem correctamente não consigo é depois gravar porque aparecem as seguintes mensagens (dependendo da situação aparece uma ou outra):

Já existia um documento com o mesmo número. O número foi incrementado. Obrigado.

ou

Desculpe mas não foi possível gravar o Dossier Interno pois já existe outro com o mesmo número.

Apagando as linhas introduzidas por este código já consigo gravar o dossier.

O que é que está mal para que não funcione?

Select bo
If ndos=56
Select bi
Go Top

Append Blank
Replace bi.Design With 'Desloc:'

Append Blank
Replace bi.ref With '01.1300.29'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.ref With '01.1300.30'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.ref With '01.1300.31'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.Design With 'Alimen:'

Append Blank
Replace bi.ref With '01.1300.26'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.ref With '01.1300.27'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.ref With '01.1300.28'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.Design With 'Mão:'

Append Blank
Replace bi.ref With '01.1300.21'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.ref With '01.1300.23'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.ref With '01.1300.25'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.ref With '01.1300.20'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.ref With '01.1300.22'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Append Blank
Replace bi.ref With '01.1300.24'
Do BOACTREF With '',.T.,'OKPRECOS','bi'
Replace bi.qtt With 0
Replace bi.stipo With 4

Do u_bottdeb

sbo.refrescar()

sbo.showsave()

Endif

Share this post


Link to post
Share on other sites
femo

Parece-me uma pergunta básica, mas aqui vai:

Nos Dossiers Internos tenho vários campos de utilizador que necessito que "passem" para o documento de faturação e não estou a conseguir.

Deve ser algo fácil, mas não consigo perceber o quê.

Se alguém puder ajudar, agradeço.

(PHC Corporate CS17)


Fernando Morais

Share this post


Link to post
Share on other sites
pc.cesar

na v17 dee ser igual

pode ser colocado num valor por defeito ou numa regra

para colocar na FI

select fi
go top
scan

if empty(fi.campouser1)
 campobi = []
 campobi = campobi + [ select bi.ndos, bo.bostamp,bi.campouser1, bi.campouser2 from bi (nolock)]
 campobi = campobi + [ inner join bo (nolock) on bi.bostamp=bo.bostamp
 campobi = campobi + [ where  bi.bistamp=']+alltrim(fi.bistamp)+[']

	  u_sqlexec(campobi ,[ucrs_bobi])
	  select ucrs_bobi

	  replace fi.campouser1 with ucrs_bobi.campouser1
	  replace fi.campouser2 with ucrs_bobi.campouser2
 endif

endscan

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.