Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Apolo

PHC - Programação em XBASE

Recommended Posts

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
NelsonPaiva

Boa tarde.

Eu tenho uma análise que ao ser executada pede uma variável que vai ser pesquisado nos dossiers.

A variável a colocar é do tipo: xx.xxxx.xx em que os dois primeiros xx é o ano, os xxxx um código, e os ultimos xx um valor sequencial.

A minha questão é que apenas funciona se colocar o valor completo da variável. Por exemplo imaginando que colocava 11.1234.01 o mapa funciona correctamente. No entanto nalgumas situações eu pretendia colocar apenas 11.1234. e queria que me mostrassem os resultados para todos os registos encontrados que começassem por esse valor (seja 11.1234.01, 11.1234.02, etc) e também pesquisar apenas pelo ano, ou seja 11.

Existe alguma forma de fazer isto?

Neste momento a variável é testada da seguinte forma: = #1#

De que forma posso alterar isto para ir buscar todos os registos que comessem pelo que indiquei?

Obrigado.

Boa tarde.

Eu tenho uma análise que ao ser executada pede uma variável que vai ser pesquisado nos dossiers.

A variável a colocar é do tipo: xx.xxxx.xx em que os dois primeiros xx é o ano, os xxxx um código, e os ultimos xx um valor sequencial.

A minha questão é que apenas funciona se colocar o valor completo da variável. Por exemplo imaginando que colocava 11.1234.01 o mapa funciona correctamente. No entanto nalgumas situações eu pretendia colocar apenas 11.1234. e queria que me mostrassem os resultados para todos os registos encontrados que começassem por esse valor (seja 11.1234.01, 11.1234.02, etc) e também pesquisar apenas pelo ano, ou seja 11.

Existe alguma forma de fazer isto?

Neste momento a variável é testada da seguinte forma: = #1#

De que forma posso alterar isto para ir buscar todos os registos que comessem pelo que indiquei?

Obrigado.

Share this post


Link to post
Share on other sites
Camarao69

Boa tarde

 

Preciso de uma tecla de utilizador que abra uma imagem cujo caminho está no campo st.u_imagem3. Alguem me pode dar uma ajuda com a  função?

 

Obrigado

Share this post


Link to post
Share on other sites
pc.cesar

Boas

 

a tecla deve ter apenas

Shellexec(ST.U_IMAGEM3)

 

desta forma será executada com o programa predefinido do windows

Share this post


Link to post
Share on other sites
camexavi

Boa tarde,

Solicito a amabilidade de alguém que me possa ajudar na seguinte situação:

Tenho um dossier interno "bo.ndos=30" que tem um campo "bo.APROVADO" (tipo checkbox 0/1), que tem um campo nas linhas "bi.U_APROVADO" (tipo checkbox 0/1).
Pretendia que, se todas as linhas tivessem o referido campo marcado(=1), automaticamente o campo "bo.APROVADO" ficasse também marcado(1), caso contrário, se alguma das linhas não tivesse marcada o campo "bo.APROVADO" ficaria desmarcado(=0)

O que tenho feito é isto, mas não funciona:

If bo.ndos=30
 Select bi
 Go Top
 Scan For !Empty(bi.ref)
  u_sqlexec([select U_APROVADO from bi where bi.U_aprovado=0 and Bi.bostamp=']+(Alltrim(bo.bostamp))+['],[curBIAPROV])
  u_sqlexec([select U_APROVADO from bi WHERE Bi.bostamp=']+(Alltrim(bo.bostamp))+['],[curBITOTAL])

  Select curBIAPROV
  Var = Reccount()

  Select curBITOTAL
  Var1 = Reccount()


  If Var=Var1
   Replace bo.aprovado With .F.
  Else
   Replace bo.aprovado With .T.
  Endif
 Endscan

Endif
Return .T.

 

Obrigado

Share this post


Link to post
Share on other sites
pc.cesar

Boas, 

Acho que percebi o conceito da ideia....

Da forma como fizeste em cada linha ele verifica se este tudo bem, ou seja de o dossier tiver 50 linhas existem 100 consultas ao SQL sem necessidade.
A regra deverá ser as ultimas a ser executada ou seja coloca no campo ordem da regra 80 assim esta será das ultimas regras a correr.

----------------Forma 1---- com select á BD--------------------

If bo.ndos!=30
   return .F.
else

Text to m.cSelbo noshow textmerge
select 
      (select count(bi.U_APROVADO) from bi where bi.ref<>'' and bi.U_APROVADO=1 and Bi.bostamp='<< (Alltrim(bo.bostamp)) >>') aprov
    , (select count(bi.U_APROVADO) from bi where bi.ref<>'' and bi.U_APROVADO=0 and Bi.bostamp='<< (Alltrim(bo.bostamp)) >>') Naprov
    , (select count(bi.U_APROVADO) from bi where bi.ref<>'' and Bi.bostamp='<< (Alltrim(bo.bostamp)) >>') total]
EndText

u_sqlexec(m.cSel,"AprovaBO")

  If (AprovaBO.aprov=AprovaBO.total) and AprovaBO.Naprov=0
   Replace bo.aprovado With .T.
  Else
   Replace bo.aprovado With .F.
  Endif

Endif
----------------Forma 2------ sem select á bd -- na teoria é mais rápido ----------------

select bo

If bo.ndos=30
replace bo.aprovado=.t.

 Select bi
 Go Top
 Scan For !Empty(bi.ref)
  if bi.u_aprovado=.f.
      Replace bo.aprovado With .F.
  Endif
 Endscan

Endif

 

  • Vote 1

Share this post


Link to post
Share on other sites
camexavi

Muito obrigado pela ajuda pc.cesar.

A forma 1 não funciona, mas a forma 2 está a funcionar.

Mais uma vez muito obrigado

Cumprimentos

Share this post


Link to post
Share on other sites
Camarao69

Boa noite

 

Gostava de saber se é possivel num browlist visualizar as respetivas imagens cujo caminho esta no campo ST.U_IMAGEM3.

 

Cumprimentos

 

Marcos Vieira

Share this post


Link to post
Share on other sites
camexavi
Em 14/11/2016 às 18:48, pc.cesar disse:

Boas, 

Acho que percebi o conceito da ideia....

Da forma como fizeste em cada linha ele verifica se este tudo bem, ou seja de o dossier tiver 50 linhas existem 100 consultas ao SQL sem necessidade.
A regra deverá ser as ultimas a ser executada ou seja coloca no campo ordem da regra 80 assim esta será das ultimas regras a correr.


----------------Forma 1---- com select á BD--------------------

If bo.ndos!=30
   return .F.
else

Text to m.cSelbo noshow textmerge
select 
      (select count(bi.U_APROVADO) from bi where bi.ref<>'' and bi.U_APROVADO=1 and Bi.bostamp='<< (Alltrim(bo.bostamp)) >>') aprov
    , (select count(bi.U_APROVADO) from bi where bi.ref<>'' and bi.U_APROVADO=0 and Bi.bostamp='<< (Alltrim(bo.bostamp)) >>') Naprov
    , (select count(bi.U_APROVADO) from bi where bi.ref<>'' and Bi.bostamp='<< (Alltrim(bo.bostamp)) >>') total]
EndText

u_sqlexec(m.cSel,"AprovaBO")

  If (AprovaBO.aprov=AprovaBO.total) and AprovaBO.Naprov=0
   Replace bo.aprovado With .T.
  Else
   Replace bo.aprovado With .F.
  Endif

Endif

----------------Forma 2------ sem select á bd -- na teoria é mais rápido ----------------

select bo

If bo.ndos=30
replace bo.aprovado=.t.

 Select bi
 Go Top
 Scan For !Empty(bi.ref)
  if bi.u_aprovado=.f.
      Replace bo.aprovado With .F.
  Endif
 Endscan

Endif

 

Boas pc.cesar,

Desculpa a insistência, mas tendo em conta o código que enviaste, será possível atualizar o campo "bo.trab5" do dossier no. 30 tendo em conta o campo "bi.u_aprovado" das linhas com a seguinte condição:

- Todas as linhas bi.u_aprovado = .t. então bo.trab5=Aprovado totalidade

- Todas as linhas bi.u_aprovado = .f. então bo.trab5=Recusado

- Algumas linhas bi.u_aprovado = .t. outras .f. então bo.trab5=Aprovado parcialmente

Obrigada

Share this post


Link to post
Share on other sites
Camarao69
12 horas atrás, pc.cesar disse:

Possivel é mas nao me recordo se funciona em corporate....

Bom dia

Não faz mal, já me tem ajudado muito a troco de nada.

Muito obrigado

Cumprimentos

Share this post


Link to post
Share on other sites
NelsonPaiva

É possível fazer com que um determinado utilizador não tenha acesso aos botoes de criar e eliminar linhas?

Eu pretendo que esse utilizador possa preencher algumas colunas das linhas mas não queria que ele eliminasse ou criasse linhas novas.

Não sei se isto é possível.

Share this post


Link to post
Share on other sites
pc.cesar

qual a versão ? corporate,  advanced ou enterprise?

 

A forma mais simples  não é esconder os botões, mas sim controlar se o cursor DELBI está vazio
não testei mas é algo do genero

REGRA

select bo
select BI

select delbi
if reccount>0
   msg("Não pode Gravar, Apagou alguma linha e não é permitido")
   SBO.pageframe.page1.cont1.lapagar,enabled=.f.
** ou
   SBO.pageframe.page1.cont1.lapagar,visible=.f.
   return .f.
else
   SBO.pageframe.page1.cont1.lapagar,enabled=.t.
endif

 

Share this post


Link to post
Share on other sites
pc.cesar
Em 11/15/2016 às 22:57, camexavi disse:

Boas pc.cesar,

Desculpa a insistência, mas tendo em conta o código que enviaste, será possível atualizar o campo "bo.trab5" do dossier no. 30 tendo em conta o campo "bi.u_aprovado" das linhas com a seguinte condição:

- Todas as linhas bi.u_aprovado = .t. então bo.trab5=Aprovado totalidade

- Todas as linhas bi.u_aprovado = .f. então bo.trab5=Recusado

- Algumas linhas bi.u_aprovado = .t. outras .f. então bo.trab5=Aprovado parcialmente

Obrigada

local contador1, contador2
contador1=0
contador2=0

select bi

scan
if bi.u_aprovado = .t.
contador1 = contador1 +1
endif

if bi.u_aprovado = .f.
contador2 = contador2 +1
endif
endscan

if contador1>=1 and Contador2=0
replace bo.trab5 with "Aprovado totalidade"

else
 if contador1=0 and Contador2>=1
   replace bo.trab5 with "Reprovado"
else
   replace bo.trab5 with "Aprovado parcialmente "+astr(contador1) + " / "+ astr(contador2)
endif

endif

 

  • Vote 1

Share this post


Link to post
Share on other sites
NelsonPaiva
Em 07/06/2016 às 16:16, NelsonPaiva disse:

Boa tarde.

Eu tenho uma análise que ao ser executada pede uma variável que vai ser pesquisado nos dossiers.

A variável a colocar é do tipo: xx.xxxx.xx em que os dois primeiros xx é o ano, os xxxx um código, e os ultimos xx um valor sequencial.

A minha questão é que apenas funciona se colocar o valor completo da variável. Por exemplo imaginando que colocava 11.1234.01 o mapa funciona correctamente. No entanto nalgumas situações eu pretendia colocar apenas 11.1234. e queria que me mostrassem os resultados para todos os registos encontrados que começassem por esse valor (seja 11.1234.01, 11.1234.02, etc) e também pesquisar apenas pelo ano, ou seja 11.

Existe alguma forma de fazer isto?

Neste momento a variável é testada da seguinte forma: = #1#

De que forma posso alterar isto para ir buscar todos os registos que comecem pelo que indiquei?

Obrigado.

Alguém me consegue dar uma ajuda nisto?

Obrigado.

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

×

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.