Postagem em destaque
- Gerar link
- X
- Outros aplicativos
Protheus :: MSSQL :: Retornando o conteúdo de campo “Memo” em uma Consulta
Às vezes precisamos consultar o conteúdo armazenado em um campo memo e, um simples SELECT não irá nos ajudar pois o conteúdo retornado será “Ininteligível”.
SELECT [alias].[memoField] AS [MEMO] FROM [table] [alias] WITH (NOLOCK) |
irá retornar algo como:
SELECT |
Para que a consulta retorne o conteúdo que desejamos e não o seu valor binário, necessitaremos efetuar conversões de tipo usando a função “CONVERT” conforme abaixo:
SELECT |
Onde teremos:
SELECT |
ou, de forma semelhante, com “CAST” onde teríamos:
SELECT |
Cujo retorno obtemos abaixo:
SELECT |
Para maiores referências consulte: “(Microsoft/TechNet)::CAST e CONVERT (Transact-SQL)”
Lembrando que uma das piores soluções implementadas pela Totvs/Microsiga foi o uso do “Memo Virtual” onde usamos a famigerada MsMM() para armazenar/obter o conteúdo do “Campo Memo”. Sempre que possível, evite a utilização do “Memo Virtual” uma vez que, depois de muito tempo o dbAccess passou a suportar mais de um “Memo Real” por Tabela.
Obs.: Para o exemplo, populei o campo RM_MEMO da Tabela SRM, através do MP/APSDU com o seguinte conteúdo:
( |
[]s
иαldσ dj
- Gerar link
- X
- Outros aplicativos
Comentários
Postagens mais visitadas
BlackTDN :: RLeg ~ Desvendando a Função ParamBox
- Gerar link
- X
- Outros aplicativos
Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login
- Gerar link
- X
- Outros aplicativos
Excelente,
ResponderExcluirme auxiliou em uma consulta para Logix Bi.
Att
Carlos Jr
No Oracle teriamos algo como:
ResponderExcluirselect replace(replace(utl_raw.cast_to_varchar2(srm.rm_memo),chr(13),'CHR(13)'),chr(10),'CHR(10)') rm_memo from siga.srm010 srm
select substr(replace(replace(utl_raw.cast_to_varchar2(DBMS_LOB.SUBSTR(SZG.ZG_XML,1000,1)),chr(13),''),chr(10),''),268,8) ZB_XML from SZG200 SZG
ExcluirComo fazer o processo inverso. Ou seja, eu quero dar um UPDATE no banco, e preciso converter o texto que eu tenho, em binário para jogar na tabela?
ResponderExcluirA conversão não é necessária. Poderá efetuar um UPDATE normalmente.
ExcluirOla srs,
ResponderExcluirSobre o assunto, como eu faria para salvar uma informação em um campo MEMO Virtual ?
Ex. tenho uma tabela e com um campo virtual Memo. Tenho uma outra rotina que precisa acessar este campo virtual desta tabela e colocar uma informação.
Obrg e aguardo
Naldo,
ResponderExcluirEm DB2 essas consultas acima não funcionaram aqui e em outro cliente de um colega.
Veja os select´s:
1)
SELECT ID_EVENTO,TPEVENTO,SEQEVENTO,AMBIENTE,DATE_EVEN,TIME_EVEN,VERSAO,VEREVENTO,VERTPEVEN,VERAPLIC,CORGAO,CSTATEVEN,CMOTEVEN,
PROTOCOLO,NFE_CHV,ISNULL(CAST(CAST(XML_ERP AS VARBINARY(1024)) AS VARCHAR(1024)),'') AS TMEMO1,
ISNULL(CAST(CAST(XML_RET AS VARBINARY(1024)) AS VARCHAR(1024)),'') AS TMEMO2
FROM SPED150
WHERE D_E_L_E_T_ = ' ' AND STATUS = 6
AND NFE_CHV = '52130602302647000101550010000595071001855580'
ORDER BY LOTE
ERRO:
DB2 SQL error: SQLCODE: -104, SQLSTATE: 42601, SQLERRMC: VARBINARY;(CAST(SPD.XML_ERP AS;VARCHAR2
Message: An unexpected token "VARBINARY" was found following "(CAST(SPD.XML_ERP AS". Expected tokens may include: "VARCHAR2".
2)
SELECT ID_EVENTO,TPEVENTO,SEQEVENTO,AMBIENTE,DATE_EVEN,TIME_EVEN,VERSAO,VEREVENTO,VERTPEVEN,VERAPLIC,CORGAO,CSTATEVEN,CMOTEVEN,
PROTOCOLO,NFE_CHV,ISNULL(CONVERT(VARCHAR(2024),CONVERT(VARBINARY(2024),XML_ERP)),'') AS TMEMO1,
ISNULL(CONVERT(VARCHAR(1024),CONVERT(VARBINARY(1024),XML_RET)),'') AS TMEMO2
FROM SPED150
WHERE D_E_L_E_T_ = ' ' AND STATUS = 6
AND NFE_CHV = '52130602302647000101550010000595071001855580'
ORDER BY LOTE
ERRO:
DB2 SQL error: SQLCODE: -440, SQLSTATE: 42884, SQLERRMC: VARCHAR;FUNCTION
Message: No authorized routine named "VARCHAR" of type "FUNCTION" having compatible arguments was found.
Adapte a consulta para uso com o DB2. Os exemplos foram montados para uso com o MS SQL e, nos comentários, tem um para Oracle. Sendo assim, verifique os tipos existentes no DB2 para a conversão e utilize-os.
ExcluirJá tentei as funções CAST que são relacionadas ao DB2 porém elas também não funcionam.
ExcluirPara o DB2 usa-se a função CAST, mas ela também não funcionou. O retorno é NOT AUTHORIZED ROUTINE. Então eu tentei o embedded sql, mas o nome da tabela sped150 tá sendo alterado.
ExcluirEu mando:
FROM %TABLE:SPED150%
E ele converte para:
FROM SPE010
Alguma outra saída?
Poliester,
ExcluirUma dica simples que irá resolver o seu problema:
1) Acesse o sistema;
2) Abra o Monitor do dbAccess;
3) Localize a conexão do seu usuário;
4) Habilite o Trace para essa conexão;
5) Acesse o Protheus e execute uma rotina que abra tabelas que possue(m) campo(s) memo reais;
6) Verifique, no Trace gerado pelo dbAccess, como a consulta foi montada pelo sistema;
7) Use-a como referência e generalize-a;
Ps.: Quando conseguir de desejar compartilhar, basta deixar um pequeno exemplo nos comentários.
[]s
Para banco Oracle transformar BLOB pra VARCHAR consegui desta maneira > utl_raw.cast_to_varchar2(dbms_lob.substr(X_COLUNA, 2000, 1)) onde o valor 2000 foi o maximo que conseguir pegar de tamanho em bytes e o 1 é de onde começa
ResponderExcluirNOssa esses campos memo são a pior coisa do protheus, totalmente desnecessário mas vlw a dica, quando eu preciso eu uso uma função que fiz mas este é uma boa dica...
ResponderExcluirMuito bom artigo!
ResponderExcluirVlw
Eu tentei usar este comando no
ResponderExcluirMSAccess 2010 e não funcionou, retorna que falta argumentos. Alguem conhece uma solução?
Uma observação importante, tenho visto muitas queryes em todos os lugares onde vejo implementações dos ERP's da TOTVS com o table hint (nolock). Isso é uma péssima prática, pois você está trabalhando com o Isolation level Read Uncommited, o que significa que estará trazendo sujeira de transações incompletas no banco (além de ter a possibilidade de impactar nas transações não completas, é difícil mas pode ocorrer). O certo para trabalhar com isolamento e melhor desempenho em bancos transacionais é o uso do table hint (readpast), pois o mesmo trará apenas transações completas.
ResponderExcluirotima dica
ResponderExcluirGostaria de pedir uma ajuda...
ResponderExcluirQuero fazer com que minhas compilações possam ser executadas ou não em um ambiente, pensei em usar o #ifdef para dizer que será compilado se o include myinclude.ch que terá uma variavel definida #define mycustom .F., essa variavel estando .T. o compilador compila no ambiente, caso esteja falsa não compila.
Com isso quero usar minha base dados de teste tanto num ambiente customizado, quanto num ambiente padrão.
Faz sentido ? Teriam uma solução melhor ?
Obrigado,
Marcio
Me ajudou em uma importação dos dados da Totvs para meu sistema, obrigado.
ResponderExcluir