Pular para o conteúdo principal

Postagem em destaque

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️

🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️ Olá pessoal, Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações. Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota. Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento. Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seu

BlackTDN :: MSSQL Usando Consulta CTE Recursiva para montagem de Tree

Aproveitando a deixa de JLouW (Limites do AdvPL – parte 02 | Tudo em ADVPl) e de uma necessidade de otimizar uma estrutura de Produtos Customizada: segue uma dica de como montar uma “Estrutura Hierarquica (Tree)” usando uma Consulta CTE Recursiva no MSSQL.

(Obs.: Exemplo elaborado na versão 2014 do MSSQL)

/*
Exemplo de Consulta Hierarquica (Tree) usando MSSQL
Autor: Marinaldo de Jesus (http://www.blacktdn.com.br)
Adaptado dos Exemplos obtidos a partir das referências abaixo
Referencias:
--Ref.:https://technet.microsoft.com/pt-br/library/ms186243(v=sql.105).aspx
--Ref.:https://msdn.microsoft.com/pt-br/library/ms186755.aspx?f=3000&MSPPError=-2147217396
--Ref.:http://www.codeproject.com/Articles/328858/Implementing-multi-level-trees-in-MS-SQL-Server
--Ref.:https://msdn.microsoft.com/pt-br/library/bb677173.aspx?f=255&MSPPError=-2147217396
--Ref.:https://msdn.microsoft.com/en-us/library/ms190328.aspx
--Ref.:https://msdn.microsoft.com/en-us/library/ms190324.aspx

*/
--------------------------------------------------------------------
IF OBJECT_ID('[dbo].[MyEmployees]','U') IS NOT NULL
DROP TABLE [dbo].[MyEmployees];
GO
-- Create an Employee table.
CREATE TABLE [dbo].[MyEmployees]
(
EmployeeID int NOT NULL
,FirstName nvarchar(30) NOT NULL
,LastName nvarchar(40) NOT NULL
,Title nvarchar(50) NOT NULL
,DeptID smallint NOT NULL
,ManagerID int NULL
CONSTRAINT PK_EmployeeID PRIMARY KEY CLUSTERED (EmployeeID ASC)
);
-- Populate the table with values.
INSERT INTO [dbo].[MyEmployees] VALUES
(1,N'Ken',N'Sánchez',N'Chief Executive Officer',16,NULL)
,(273,N'Brian',N'Welcker',N'Vice President of Sales',3,1)
,(274,N'Stephen',N'Jiang',N'North American Sales Manager',3,273)
,(275,N'Michael',N'Blythe',N'Sales Representative',3,274)
,(276,N'Linda',N'Mitchell',N'Sales Representative',3,274)
,(285,N'Syed',N'Abbas',N'Pacific Sales Manager',3,273)
,(286,N'Lynn',N'Tsoflias',N'Sales Representative',3,285)
,(16, N'David',N'Bradley',N'Marketing Manager',4,273)
,(23, N'Mary',N'Gibson',N'Marketing Specialist',4,16)
,(24, N'Mary 24',N'Gibson 24',N'Marketing Assistant SR',4,23)
,(25, N'Mary 25',N'Gibson 25',N'Marketing Specialist',4,16)
,(26, N'Mary 26',N'Gibson 26',N'Marketing Assistant SR',4,23)
,(27, N'Mary 27',N'Gibson 27',N'Marketing Assistant PL',4,24)
,(28, N'Mary 28',N'Gibson 28',N'Marketing Assistant JR',4,27)
,(29, N'Mary 29',N'Gibson 29',N'Marketing Assistant Trainee SR',4,28)
,(30, N'Mary 30',N'Gibson 30',N'Marketing Assistant SR',4,23)
,(31, N'Mary 31',N'Gibson 31',N'Marketing Assistant PL',4,24)
,(32, N'Mary 32',N'Gibson 32',N'Marketing Assistant JR',4,27)
,(33, N'Mary 33',N'Gibson 33',N'Marketing Assistant Trainee SR',4,28)
,(34, N'Mary 34',N'Gibson 34',N'Marketing Specialist',4,16)
,(35, N'Mary 35',N'Gibson 35',N'Marketing Specialist SR',4,34)
,(36, N'Mary 36',N'Gibson 36',N'Marketing Specialist PL',4,35)
,(37, N'Mary 37',N'Gibson 37',N'Marketing Specialist JR',4,36)
,(38, N'Mary 38',N'Gibson 38',N'Marketing Specialist Trainee SR',4,37)
,(39, N'Mary 39',N'Gibson 39',N'Marketing Specialist Trainee PL',4,38);
GO
--------------------------------------------------------------------
IF OBJECT_ID (N'[dbo].[ufn_FindReports]',N'TF') IS NOT NULL
DROP FUNCTION [dbo].[ufn_FindReports];
GO
CREATE FUNCTION [dbo].[ufn_FindReports]()
RETURNS @retFindReports TABLE
(
ID int IDENTITY(1,1) PRIMARY KEY
,MasterID int NOT NULL
,SuperID int NOT NULL
,ManagerID int NOT NULL
,Level int NOT NULL
,EmployeeID int NOT NULL
,NodeID nvarchar(3000) NOT NULL
)
AS
BEGIN
WITH DirectReports(
MasterID
,SuperID
,ManagerID
,Level
,EmployeeID
,NodeID
)
AS
(

(
SELECT m.EmployeeID AS MasterID
,0 AS SuperID
,IsNull(m.ManagerID,0)
,0 AS Level
,m.EmployeeID
,convert(varChar(3000),+cast(m.EmployeeID AS varchar)) AS NodeID
FROM dbo.MyEmployees AS m
WHERE m.ManagerID IS NULL
)
UNION ALL
(
SELECT d.MasterID
,(
CASE d.ManagerID
WHEN 0
THEN d.EmployeeID
ELSE d.ManagerID
END
) AS SuperID
,e.ManagerID
,d.Level+1
,e.EmployeeID
,convert(varChar(3000),d.NodeID+'.'+cast(e.EmployeeID AS varchar)) AS NodeID
FROM dbo.MyEmployees AS e
INNER JOIN DirectReports AS d
ON d.EmployeeID=e.ManagerID
)
)
INSERT @retFindReports
SELECT *
FROM DirectReports
RETURN
END;
GO
SELECT REPLICATE(' ',4*(t.Level))+'+-->'+LTrim(Str(t.ManagerID,3)) AS ManagerID
,e.EmployeeID
,e.FirstName
,e.LastName
,REPLICATE(' ',4*(t.Level))+'+--> '+e.Title AS Title
,e.DeptID
,t.ID
,t.MasterID
,t.SuperID
,t.Level
,t.NodeID
FROM dbo.ufn_FindReports() t
LEFT JOIN dbo.MyEmployees e
ON e.EmployeeID=t.EmployeeID
ORDER BY t.MasterID
,t.NodeID
GO
--------------------------------------------------------------------

Tree - Usando CTE Recursiva


O código do exemplo poderá ser obtido aqui.


P.S.: No Oracle parece ser bem mais simples (Wiki: Hierarchical and recursive queries in SQL):


SELECT LEVEL, LPAD (' ', 2 * (LEVEL - 1)) || ename "employee", empno, mgr "manager"
FROM emp START WITH mgr IS NULL
CONNECT BY PRIOR empno = mgr;

 



[]s

иαldσ dj

Comentários

Postagens mais visitadas deste blog

BlackTDN :: RLeg ~ Desvendando a Função ParamBox

Para quem precisar desenvolver uma interface de entrada de dados, coisa rápida, e não quer ter aquele trabalhão danado que todos já sabemos, o Protheus tem uma função que ajuda muito, é uma interface semelhante a função Pergunte, porém com muito mais opção de objeto de entrada de dados, alias até colocar o scrollbox desta interface com todos os objetos em outra MsDialog ou Wizard é simples. Vejam o exemplo abaixo, boa sorte! Rleg. //---------------------------------------------------------- // Função exemplo utilizando a função ParamBox() //---------------------------------------------------------- User Function xParamBox() Local aRet := {} Local aParamBox := {} Local aCombo := {"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"} Local i := 0 Private cCadastro := "xParambox" // ---------------

BlackTDN :: Customizando a interface de Login no Protheus e by You

A publicação “ BlackTDN :: By You e sua nova tela de login ”  de nosso amigo OBona deu o que falar e, em função disso, esse que a muito não vos escreve resolveu criar uma versão onde será possível personalizar, “por completo”, a tela de login no Protheus/by You. Considerando que OBona já havia “mapeado, identificado e customizado” as imagens peguei-as emprestadas para o exemplo que se segue: O primeiro passo para a customização “total” da interface de login do Protheus/by You será implementar o “Ponto de Entrada” ChgPrDir (Diretório de impressão) . Usaremos esse PE juntamente como programa U_FindMsObject.prg (apresentado pela primeira vez em: Protheus :: ADVPL : The Container : Presents Pandora's box ). Diferente do exemplo proposto por OBona, que substitui, durante o processo de compilação, as imagens padrões do sistema (excluindo-as) por imagens customizadas (com o mesmo nome) este novo exemplo mantém, no RPO, as imagens padrões adicionando novas imagens customizadas que serã

Protheus :: Chamando Funções do Menu Diretamente e sem a Necessidade de Login

Ferne$ perguntou: "...é possível abrir alguma rotina do sistema sem solicitar login ao usuário, como por exemplo a rotina MATA010..." Sim Ferne$, é possível sim. Abaixo um Exemplo para a Chamada à função MATA010 sem a necessidade de Login no sistema. #INCLUDE "PROTHEUS.CH" #INCLUDE "TBICONN.CH" /*/ Funcao: MATA010Ex Data: 30/04/2011 Autor: Marinaldo de Jesus Descricao: Executar a Funcao MATA010 diretamente sem a necessidade de LOGIN no Protheus Sintaxe: 1 ) U_MATA010Ex ( Chamada diretamente na Tela de Entrada do Sistema ) ; ou 2 ) totvsclient.exe -q -p=u_MATA010Ex -a=01;01 -c=rnp_local -e=rnp -m -l ( Chamada Via Linha de Comando ) /*/ User Function MATA010Ex( cEmpFil ) Local aEmpFil Local bWindowInit := { || __Execute( "MATA010()" , "xxxxxxxxxxxxxxxxxxxx" , "MATA010" , "SIGAFAT" , "SIGAFAT", 1 , .T. ) } Local cEmp Local cFil Local cMod Local cModName := "SIGAFAT" DEFA