Jump to content
Apolo

PHC - Programação em XBASE

Recommended Posts

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
joaquimmoreira

olá boa tarde pessoal

precisava de obter na listagem de artigos uma coluna com os valores com IVA para isso tenho o seguinte código, mas não está funcionar correctamente porque só aparecem 000000, será que alguém pode-me ajudar a verificar onde está o erro.

MEUSELECT = ""

TEXT TO MEUSELECT NOSHOW

SELECT ST.EPV4 * (1+(ISNULL((SELECT TAXASIVA.TAXA FROM TAXASIVA (NOLOCK) WHERE TAXASIVA.CODIGO = ST.TABIVA),0)/100)) AS VALOR

FROM ST (NOLOCK) WHERE ST.REF = '<<m.TsqlReturn>>'

ENDTEXT

U_SQLEXEC (MEUSELECT,"CURSOR_STVAL")

RETURN CURSOR_STVAL.VALOR

Share this post


Link to post
Share on other sites
Zm3

alguém me pode ajudar numa questão sobre programação PHC?

é possível criar e trabalhar com funções usando a framework PHC.

Por exemplo dentro de uma regra criar funções que execute determinado procedimento.

Já tentei criar função, mas não obtenho qualquer resposta.

Exemplo:

===============================================

Function FazIsto

** funcao

messagebox("FazIsto")

...

EndFunc

**chamada da funcao

Fazisto()

===============================================

Share this post


Link to post
Share on other sites
pc.cesar

Qual a versão do PHC

as funções tem e ser criadas na tecla ou regra que pretende utilizar

exemplo:

function fecha_ecra

PDU_2760WF2LM.Hide

endfunc

fecha_ecra()

Share this post


Link to post
Share on other sites
Zm3

Obrigado pela resposta.

A versão é PHC18. Entretanto resolvi o problema sem recorrer a funções.

Share this post


Link to post
Share on other sites
Camarao69

Boa tarde

Alguem me sabe dizer se é possivel passar todos os artigos de um cursor para a memoria interna dos stocks e serviços

if m.escolheu=.t.

navega("ST",curST.ststamp)

como faço para que me de todos sem ter de escolher.

Obrigado

Share this post


Link to post
Share on other sites
pc.cesar

boas,

Não percebi o que realmente pretende

mas podes fazer o seguinte

if u_sqlexec([select st.ref, st.design, st.stock from st(nolock) where st.familia=AAA], [sTLIST])

fecha("STLIST")

select STLIST

else

endif

Se clicares no ecra de stock no icone "Lista de seleção" e terás o teu cursor

Share this post


Link to post
Share on other sites
toribeiro

Viva a todos!

Sou iniciante no Phc e surgiu-me uma dúvida, será que é possível restringir alguns campos do ecrã "stock e serviços" para apenas um utilizador ter acesso a esses respectivos campos?

E se sim, qual o procedimento mais adequado?

Se alguém me pudesse esclarecer esta dúvida agradecia :)

Edited by toribeiro

Share this post


Link to post
Share on other sites
pc.cesar

Duas formas

- poder criar ecras personalizados

ou

- podes editar o ecra e em cada campo dizer se os utilizadores/Grupos/Perfiz podem ver / editar - de forma a otimizar aconcelho a utilização da personalização por grupos ou perfis e não por utilizador..

Share this post


Link to post
Share on other sites
toribeiro

Obrigado pela resposta.

Mas sabes dizer-me qual a propriedade dos ecrãs personalizados que me permite definir os utilizadores/Grupos/Perfis que tem acesso a ver ou editar o respectivo campo?

Estive a ver todas as propriedades dos ecrãs personalizados e não encontrei nenhuma que me permitisse definir o utilizador/Grupo/Perfil.

Estou a trabalhar na versão PHC CS Corporate V18

Share this post


Link to post
Share on other sites
pc.cesar

vou confirmar... mas acho que é a primeira opção das propriedades

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.