Como muitos já sabem, para criação de um campo memo virtual, e necessário que sejam criados dois campos, um de código e o outro com tipo memo virtual. E esses dados são gravados na tabela SYP. Para colocar este conteúdo numa variável, podemos criar uma simples função que leia todas as linhas da tabela SYP correspondente ao código do campo desejado. Podemos fazer por uma consulta SQL ou simplesmente usando o dbSelectArea() Exemplo: Local cCodigo:= SB1->B1_B1_DESC_P //Código da descrição em Português Local cTexto := U_LerMemo(cCodigo) A função poderia ficar assim:
User Function LerMemo(cChave) Local nPos := 0 Local nTam := Len(Space(TamSx3("YP_TEXTO")[1])) Local cLine := "" Local cString := "" DbSelectArea("SYP") SYP->(DbSetOrder(1)) SYP->(DbGoTop()) If(SYP->(DbSeek(xFilial("SYP") + cChave, .T.))) While SYP->(!Eof()) .And. ( cChave == SYP->YP_CHAVE ) .And. ( xFilial("SYP") == SYP->YP_FILIAL ) nPos := At("\13\10",Subs(SYP->YP_TEXTO,1,nTam+6)) If ( nPos == 0 ) cLine := RTrim(Subs(SYP->YP_TEXTO,1,nTam)) If ( nPos2 := At("\14\10", cLine) ) > 0 cString += StrTran( cLine, "\14\10", Space(6) ) Else cString += cLine EndIf Else cString += Subs(SYP->YP_TEXTO,1,nPos-1) + " " EndIf SYP->(DbSkip()) End While SYP->(DbCloseArea()) Endif Return(cString)Agora, lendo por uma consulta SQL, mas limitando as 3 primeiras linhas.
cQuery := " SELECT " + CRLF cQuery += " EE9_COD_I CODIGO, " + CRLF cQuery += " ( " + CRLF cQuery += " SELECT " + CRLF cQuery += " (CASE (SELECT COUNT(YP_TEXTO) FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='001' AND D_E_L_E_T_='') WHEN 0 THEN '' ELSE (SELECT YP_TEXTO FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='001' AND D_E_L_E_T_='') END) + " + CRLF cQuery += " (CASE (SELECT COUNT(YP_TEXTO) FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='002' AND D_E_L_E_T_='') WHEN 0 THEN '' ELSE (SELECT YP_TEXTO FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='002' AND D_E_L_E_T_='') END) + " + CRLF cQuery += " (CASE (SELECT COUNT(YP_TEXTO) FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='003' AND D_E_L_E_T_='') WHEN 0 THEN '' ELSE (SELECT YP_TEXTO FROM SYP010 WHERE YP_CHAVE=B1_DESC_GI AND YP_SEQ='003' AND D_E_L_E_T_='') END) " + CRLF cQuery += " AS MEMO " + CRLF cQuery += " FROM " + RETSQLNAME("SB1") + " SB1A " + CRLF cQuery += " WHERE B1_COD=EE9_COD_I " + CRLF cQuery += " AND SB1A.D_E_L_E_T_=' ' " + CRLF cQuery += " AND B1_FILIAL='"+xFilial("SB1")+"' " + CRLF cQuery += " ) DESCRICAO, " + CRLF cQuery += " EE9_UNIDAD UNIDADE, " + CRLF cQuery += " EE9_SLDINI QTDE, " + CRLF cQuery += " EE9_PSLQUN PESO, " + CRLF cQuery += " EE9_POSIPI NCM, " + CRLF cQuery += " EE9_PRCTOT TOTAL " + CRLF cQuery += " FROM " + RETSQLNAME("EE9") + " EE9 " + CRLF cQuery += " INNER JOIN " + RETSQLNAME("SB1") + " SB1B ON B1_FILIAL='"+xFilial("SB1")+"' AND SB1B.D_E_L_E_T_=' ' AND B1_COD = EE9_COD_I " + CRLF cQuery += " WHERE EE9.D_E_L_E_T_ = ' ' " + CRLF cQuery += " AND EE9_FILIAL = '"+xFilial("EE9")+"' " + CRLF cQuery += " AND EE9_PREEMB = '"+cEmbarque+"' " + CRLF cQuery += " ORDER BY " + cOrdemTem outras formas, mas segue uma que pode facilitar seu dia a dia.