Jump to content
Apolo

PHC - Programação em XBASE

Recommended Posts

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
femo
Em 17/02/2017 às 16:27, NelsonPaiva disse:

Alguém me consegue dar uma ajuda nisto?

Obrigado.

Sem ter testado, parece-me que bastará na condição em vez de colocares = colocares Like '%'#1#'%' (o % em SQL funciona como o * )

  • Vote 1

Fernando Morais

Share this post


Link to post
Share on other sites
NelsonPaiva
Em 18/02/2017 às 22:40, femo disse:

Sem ter testado, parece-me que bastará na condição em vez de colocares = colocares Like '%'#1#'%' (o % em SQL funciona como o * )

Vou testar então a ver.

Share this post


Link to post
Share on other sites
pc.cesar
Em 18/02/2017 às 22:40, femo disse:

Sem ter testado, parece-me que bastará na condição em vez de colocares = colocares Like '%'#1#'%' (o % em SQL funciona como o * )

 

where campo like #1#

 

Ao executar a analise, quando aparecer o ecra das variaveis de pesquisa coloca %oqueprocuras%, a % substitui qualquer caracter

Share this post


Link to post
Share on other sites
Camarao69

Boa tarde

Preciso de ajuda por favor,preciso de saber qual a função que determina a linha seleccionada num dossie interno (se possivel)

O que pretendo é saber qual o st.stock-qttcli da linha seleccionada no dossier interno.

 

Por exemplo tenho este código inserido numa grelha  de um dossier interno que esta a  funcionar lindamente, 

u_sqlexec([select nocredit  from dbo.cl where cl.no=]+astr(bo.no),[curCL])

select curCL
if curCL.nocredit=.T.

SBO.pageframe1.page1.obj92.value="FATURAÇÃO CANCELADA"
else
SBO.pageframe1.page1.obj92.value=" "

SBO.refrescar

endif

 

Agora só não sei como como pedir ao phc que me de os dados de uma  linha seleccionada quero que me  dê o st.stock-qttcli dessa linha.

 

Obrigado

 

Edited by Camarao69
Erros ortograficos

Share this post


Link to post
Share on other sites
pc.cesar

Notas:
1) o PHC ja faz isso nos dosiser, existe um parâmetro para activar
2) pretende a o STOCK - QTTCLI de todos os armazens , ou do armazem que estiver na linha porque as QTT podem ser diferentes

 

3) aqui vai o que pretende no caso de nao interessar a QTT por armazem, o formato grelha funciona, mas apenas se alterar algum valor na linha o simples cliar em cima nao faz nada.
select bo
select bi
if u_sqlexec([select design, stock, st.stock-qttcli  from st(nolock) where st.ref=]+alltrim(bi.ref),[curCL])

mostrameisto("curCL")

endif

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.