Ir para conteúdo
Fórum Script Brasil
  • 0

Select complicado de fazer


kania

Pergunta

Olá pessoal, gente me deram um tarefa aqui na empresa bem diferente do que eu to acontumado, por isso estou recorrendo aos universitarios, para ver se alguém já fez algo parecido para me ajudar.

Vamos ver s eocnsigo explicar.

o bando de cadastro de clientes tewra que ter algumas informações específicas e é isto que esta me confundindo.

teremos

IDCliente

IDIndicador (quem indicou o cliente, só pode ser alguém que já seja cliente da empresa)

IDAscendente (aqui eu to me perdendo)

a montagem do banco fui eu quem fiz seguindo as informações que foram solicitadas aqui na empresa.

Bom é assim:

O sistema tem que dividir os clientes em 2 grupos, que estou chamando de GRUPO ESQUERDO e GRUPO DIREITO, isto porque a empresa quer que eu coloque os cliente em um sistema de Árvore, tipo Binário, um abaixo do outro.

Um cliente vai se cadastrar no site da empresa, para ele se cadastrar ele tem que ter um outro cliente que esta indicando ele, e tem que escolher em que grupo ele quer se cadastrar, ESQUERDO OU DIREITO, até aqui tudo beleza, o problema meu esta em que vamos imaginar algumas situações que estou pegando na hora de montar as regras.

vamos imaginar uma relação de clientes:

IDCLIENTE | IDINDICADOR | IDASCENDENTE | GRUPO

------------------------------------------------------------------------

1 1 1 D (este cliente será a própria empresa que por ela iniciará toda a rede)

2 1 1 E

3 1 1 D

4 2 2 D

5 4 4 D

6 2 5 D (aqui eu tenho um problema, pois não consigo pegar qual é o ascendente na rede)

7 3 3 E

-------------------------------------------------------------------------

Se montarmos esta sequencia em uma forma gráfica em 2 grupos esquerdo e direito veremos uma arvore em um sistema binário, vejam, até onde chegue.

IdIndicador =  Session("IdIndicador")
Grupo = Session("Grupo")

'PRIMEIRO PRECISO VERIFICAR QUL O UTIMO ID CADASTRADO NA PERNA ESCOLHIDA
'DO PATROCINADOR PARA TER O ID DO ASCENDENTE

    Set RsAs = Server.CreateObject("adodb.recordset")
    SQL = "select max(IdCliente) as IdCliente from cad_cliente where IdIndicador = '" & IdIndicador & "' and Grupo = '"&Grupo&"'"
    RsAs.Open SQL,Conn,3,3
    
    If IsNull(RsAs("IdCliente")) then
        IdAscendente = IdIndicador
        
    else
        IdAscendente = RsAs("IdCliente")
    
    RsAs.Close
    Set RsAs = Nothing
    End If

  1. Bom primeiro ey gravo as variaveis de quem esta indicando e em que grupo este novo cadastro deve ser colocado (Direito ou Esquerdo)
  2. Depois verifico no BD o utimo cadastro efetuado dentro daquele grupo o INDICADOR seja igual ao Indicador escolhido pelo novo cliente e que este utimo registro esteja dentro do mesmo Grupo (esquerdo ou Direito)
  3. Depois vejo se caso seja o primeiro cadastro deste Indicador ele vai defenir o IdAscendente sendo o prórpio IdIndicador
  4. Se o Indicador já tiver algum indicado no respectivo grupo, então eu devo pegar como IdAscendente o Utimo IDAscendente cadastrado neste grupo

Bom tudo estava funcionando certinho até que eu fiz o seguinte teste.

Peguei um Indicador que já possuia 3 cadastros um abaixo do outro dentro do mesmo grupo, quando fiz o teste de cadastro em vez dele pegar o IdAscendente sendo o utimo Di cadastrado dentro do grupo, ele colocou como IDAscendente o Próprio IdIndicador, porque este Indicador ainda não tinha ninguém cadastrado diretamente.

esta situação pelo que entendi, eles chama de DERRAMAMENTO, que é quando o cliente esta cadastrado, e já tem abaixo dele seja no grupo dirieto ou esquerdo varios outros cadastros que não foram efetuados por ele mesmo, sendo assim qu8ando ele ou outra cliente efetuar um novo cadastro este deve sempre entrar na utima posição do grupo, tendo como IDAscendete o ID do grupo cadastrado.

Sei que é muito complicado de entender, mas será que alguém consegue em auxiliar?

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Olá Denis, então fera, primeiramente obrigado epla resposta.

Minha dúvida é como eu consigo pegar o utimo valor de um dos grupos (DIREITO OU ESQUERDO), se eu der um select simples, tipo:

SELECT MAX(IdConsultor) AS ASCENDENTE from cad_consultor where PernaCadastro = 'D'
Ele me traz certinho o utimo registro, porem eu preciso limitar a busca com o critéio do Id de quem esta fazendo cadastro na hora, vou tentar explicar melhor. temos 2 grupoos
VOCE
===================
grupo1       |         grupo 2
Abaixo deste dois grupos é que entrram os outros cadastros, esotu tentando colocar de forma gráfica para ficar mais simples de entender, mas é claro que no banco de dados não é assim que vai estar, no banco criei alguns campos para ajudar a fazer as buscas IdConsultor > Id do consultor cadastrado IdPatrocinador > Id de quem indicou a pessoa para se cadastrar IdAscendente > Id da pessoa que fica logo acima dentro da rede, não necessáriamente que é quem indicou, obrigatório o novo cadastrado ficar dentro da equipe do indicador, porem não precisa que ele seja o Ascendente PernaCadastro > Grupo onde ele será cadastrado, direita ou esquerda PernaPadrao > Caso o usuário queria ele poderá deixar umdos grupos como padrão para cadastrar, ou para esquerda ou para direita, o código vai pegar o padrão definido. Como notou o meu problema esta em que eu não estou conseguindo ontar um selct que traga o id do ascendente, eu consigo pegar o MAX id dentro do grupo esquerdo ou dirieto, porem nem sempre ele pega correto, porque se notou teri casos em que um novo cadastro poderá entrar por dentro do grupo, veja
VOCE ID: 1
==== GRUPO ESQUERDO  ================== GRUPO DIREITO ===========
                    ID: 2-1-1                            |                         ID:3-1-1
            ID:4-1-2                                     |                                    ID:7-3-3
      ID:5-2-4  |  ID:6-4-4                         |                            ID:8-7-7         ID:9-3-1
Não sei se o desenho deu para entender, os número coloquei assim primeiro número = no ido cadastrado segundo número = id do patrocinador terceiro número = id do ascendente Note que oa scendete sempre vai ser o cara que esta logo acima na rede Vamos pegar o exemplo do ID:5 ele tem patrocinador o ID 2 e seu ascendente é o ID 4 quando eu faço a contagem para pegar o id do ascendente neste caso o 4 ele pega o 2 ao envez do 4, porque como o ID ainda não tem nenhum cadastro "Null" acredito que ele se perde, nos casos em que o cara já tem um cadastro ao menos ele pega certinho Sei lá o que ta dando de errado fera, fico grato se puder me auxiliar, obrigado caso queria testar
CREATE TABLE `cad_consultor` (
  `IdConsultor` int(11) NOT NULL AUTO_INCREMENT,
  `IdPatrocinador` int(11) DEFAULT NULL,
  `IdAscendente` int(11) DEFAULT NULL,
  `Nome` varchar(150) DEFAULT NULL,
  `Email` varchar(150) DEFAULT NULL,
  `DataNascimento` date DEFAULT NULL,
  `Senha` varchar(30) DEFAULT NULL,
  `Sexo` varchar(1) DEFAULT NULL COMMENT 'F=Femenino, M=Masculino',
  `TipoPessoa` varchar(1) DEFAULT NULL COMMENT 'F = Física, J = Jurídica',
  `CpfCnpj` varchar(18) DEFAULT NULL,
  `Rg` varchar(25) DEFAULT NULL,
  `Cep` varchar(10) DEFAULT NULL,
  `Endereco` varchar(255) DEFAULT NULL,
  `Numero` varchar(10) DEFAULT NULL,
  `Complemento` varchar(50) DEFAULT NULL,
  `Bairro` varchar(50) DEFAULT NULL,
  `Cidade` varchar(50) DEFAULT NULL,
  `Estado` varchar(2) DEFAULT NULL,
  `Pais` varchar(25) DEFAULT NULL,
  `TelRes` varchar(13) DEFAULT NULL,
  `TelCel` varchar(13) DEFAULT NULL,
  `Banco` varchar(100) DEFAULT NULL,
  `Agencia` varchar(25) DEFAULT NULL,
  `Conta` varchar(25) DEFAULT NULL,
  `TipoConta` varchar(1) DEFAULT NULL COMMENT 'C = Corrente - P = Pupança',
  `NivelQuali` varchar(2) DEFAULT '1' COMMENT 'Nivel de Qualificação do Consultor - 1:Consultor, 11:Consultor Silver, 12:Consultor Gold, 13: Consultor Platinium, 21:Diretor Silver, 22:Diretor Gold, 23:Diretor Platinum, 31:Premium Asa 1, 32: Premium Asa 2, 33:Eagle',
  `PernaCadastro` varchar(1) DEFAULT NULL COMMENT 'D = Direita, E = Esquerda',
  `PernaPadrao` varchar(1) DEFAULT NULL COMMENT 'D = Direita, E = Esquerda',
  `DataCadastro` date DEFAULT NULL,
  `Acessos` varchar(20) DEFAULT '0',
  `Contrato` int(1) DEFAULT '1' COMMENT '1 = Sim 2= Não',
  PRIMARY KEY (`IdConsultor`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;

Editado por kania
Link para o comentário
Compartilhar em outros sites

  • 0

Para Facilitar o entendimento estou colocando uma imagem explicativa de como funciona a visualização na pratica de tudo isto

tela_exemplo.png

com esta imagem consigo demonstrar bem um erro que esotu tendo, iamginemos que o ID:1 primeiro do topo resolva cadastrar alguém do seu lado esquerdo, este deveria cair abaixo do ID:8 (8.5.5) e sua identificação ficaria (12.1.8) 12 seu ID, 1 seu patrocinador, 8 seu Ascendente, para tentar pegar o ID do ascendente que estou tentando utilizar o MAX mas ou eu estou fazendo a consulta de forma errada ou não é com MAX que se faz, porque quando eu dou um

SELECT MAX(IdConsultor) AS ASCENDENTE from cad_consultor where PernaCadastro = 'e' and IdPatrocinador = 1

ele traz como resultado de ID para ser Ascendente o ID:4 (4.1.2) ele não consegue pegar o correto que seria 8.5.5

Editado por kania
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...