kania 0 Denunciar post Postado Fevereiro 11, 2009 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 Bom primeiro ey gravo as variaveis de quem esta indicando e em que grupo este novo cadastro deve ser colocado (Direito ou Esquerdo) 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) Depois vejo se caso seja o primeiro cadastro deste Indicador ele vai defenir o IdAscendente sendo o prórpio IdIndicador Se o Indicador ja 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 ja 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? Compartilhar este post Link para o post Compartilhar em outros sites
Alex_poty 0 Denunciar post Postado Fevereiro 13, 2009 Não entendi. Quais serão os relacionamentos? quais vículos? está muito subjetivo. Sugiro que deixe de lado as questões técnicas e pense no primeiro passo (levantamento de dados). Que resultado você quer chegar? quais as excessões? Acho que dá pra te ajudar mas precisa de mais clareza. Por exemplo! você colocou um dado como sendo (1 1 1 D) o início dos dados com a própria empresa, mas você esqueceu que a empresa também deve começar no grupo E ou seja, (1 1 1 E). Pra isso bastaria criar possibilidades e um simples teste de mesa pode resolver seu problema, inclusive acho que fica mais fácil pensar em mudar algumas posições como INDICADOR e GRUPO primeiro. 1 D 1 1 1 D 2 1 1 D 2 n 1 D 3 1 1 D n n n D n n 1 E 1 1 1 E 2 1 1 E 2 n 1 E 3 1 1 E n n n E n n ou GRUPO e INDICADOR primeiro. D 1 1 1 D 1 2 1 D 1 2 n D 1 3 1 D 1 n n D 1 n n D n n n E 1 1 1 E 1 2 1 E 1 2 n E 1 3 1 E 1 n n E 1 n n E n n n Na minha opinião até se entende melhor visualmente. Existem inúmeras possibilidades concorda? Por isso ficaria mais fácil de entender se você disser quais as excessões. Valewww... Compartilhar este post Link para o post Compartilhar em outros sites
kania 0 Denunciar post Postado Fevereiro 13, 2009 Olá Alex, obrigado por responder ao meu tópico. Vamos lá vou tentar te explicar como funciona esta rotina, eu também levei um tempo para entender exatamente o que a empresa queria. para facilitar vou colocar uma iamgem explicativa. Meu primeiro problema encontrado já na hora de cadastrar. Preciso pegar e dar um select na tabela para pegar o utimo registro cadastrado dependendo do lado que foi feito oc adastro, sendo que as pernas internas não podem entrar na consulta, ai fiz assim: SELECT MAX(IdConsultor) as IdConsultor FROM cad_consultor WHERE IdPatrocinador = 1 and PERNACADASTRO = 'E' Porem a consulta não esta trazendo o ID que realmente eu preciso como referencia para cadastrar o novo cliente, deixa eu ver se consigo explicar usando a imagem acima 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 ou ainda eu precise colocar no banco alguma informação para que a consulta entenda que quando eu peço para pegar o MAX ID do banco de um determinado lado é somente a parte de fora daquela linha e não contar a parte de dentro da linha tipo parte de fora seria os cadastros (Lado esquerdo: 2.1.1, 4.1.2, 5.2.4, 8.5.5 - Lado Direito: 3.1.1, 6.3.3) Lado de dentro (chamada de perna interna) (Lado Esquerdo: 7.2.2 - Lado Direito: 9.3.3, 10.9.3, 11.3.10) O que corre então é isto quando eu dou o Select Max.. ele pega tudo que for referente aquele lado que contenha a identificação 'D' OU 'E' Esquerda ou Direita. estou colcocando aqui a modulagem do banco de dados que fiz, para verem se fiz algo de errado, afnal derrpente estou comendo bola no BD, desde ontem estou debruçado sobre tudo do MySql para ver se tem algum comando, clausula que eu possa usar para pegar este ID # MySQL-Front 5.0 (Build 1.210) /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE */; /*!40101 SET SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES */; /*!40103 SET SQL_NOTES='ON' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS */; /*!40014 SET UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS */; /*!40014 SET FOREIGN_KEY_CHECKS=0 */; # Host: localhost Database: grupoeagle # ------------------------------------------------------ # Server version 5.1.30-community USE `grupoeagle`; # # Table Objects for table cad_consultor # DROP TABLE IF EXISTS `cad_consultor`; CREATE TABLE `cad_consultor` ( `IdConsultor` int(11) NOT NULL AUTO_INCREMENT, `IdPatrocinador` int(11) DEFAULT NULL, `IdAscendente` int(11) DEFAULT NULL, `PernaCadastro` varchar(1) DEFAULT NULL COMMENT 'D = Direita, E = Esquerda', `PernaPadrao` varchar(1) DEFAULT NULL COMMENT 'D = Direita, E = Esquerda', `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', `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=59 DEFAULT CHARSET=utf8; # # Dumping data for table cad_consultor # LOCK TABLES `cad_consultor` WRITE; /*!40000 ALTER TABLE `cad_consultor` DISABLE KEYS */; INSERT INTO `cad_consultor` VALUES (1,1,1,'D','D','Grupo Eagle Ltda','eagle@grupoeagle.com.br','2009-02-01','123456','M','J','000.000/0001-00','5.957.007-2','82630490','Estrada de Santa Cândida','474','Casa E','Santa Cândida','Curitiba','PR','Brasil','(41)3257-7941','(41)9999-9999','356 - BANCO ABN AMRO REAL S.A.','1234','123456-7','P','1','2009-02-06','8',NULL); INSERT INTO `cad_consultor` VALUES (2,1,1,'E','E','Jorge Fabiano de Carvalho Kania','eagle@grupoeagle.com.br','1975-01-30','123456','M','F','866.554.509-34','5.957.007-2','82630490','Estrada de Santa Cândida','474','Casa E','Santa Cândida','Curitiba','PR','Brasil','(41)3257-7941','(41)9999-9999','356 - BANCO ABN AMRO REAL S.A.','1234','123456-7','P','33','2009-02-06','8',NULL); INSERT INTO `cad_consultor` VALUES (44,1,1,'D','D','Teste',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (45,1,2,'E','E','teste 2',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (46,2,45,'E','E','teste 3',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (47,44,44,'D','D','teste 4',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (48,2,2,'D','D','Teste 5',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (49,46,46,'E','E','teste 6',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (50,44,44,'E','E','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (51,44,50,'E','E','',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (52,44,51,'E','E',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (53,50,50,'D','D',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (54,53,53,'D','D',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (55,45,49,'E','E',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (56,45,45,'D','D',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (57,55,55,'D','D',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); INSERT INTO `cad_consultor` VALUES (58,57,57,'E','E',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,NULL,NULL,NULL,NULL,NULL,'1',NULL,'0',1); /*!40000 ALTER TABLE `cad_consultor` ENABLE KEYS */; UNLOCK TABLES; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; Também estou disponibilizando um código que fiz para ver se os dados do banco estavam entrando corretamente, é claro que os dados do banco forma colocados na mão direto no banco, algo que terá que ser feito direto pelo código depois. <title>Tela de Teste da Rede Linear</title> <!--#include file="conecta/conn.asp" --> <% IdPatrocinador = Request.QueryString("Proximo") Set RsAs = Server.CreateObject("adodb.recordset") SQL = "SELECT COUNT(IdAscendente) as TotalCadE from cad_consultor where IdAscendente = '" & IdPatrocinador & "' and PernaCadastro = 'E'" RsAs.Open SQL,Conn,3,3 IF RsAs("TotalCadE") < "1" Then Set RsAs2 = Server.CreateObject("adodb.recordset") SQL = "SELECT COUNT(IdAscendente) as TotalCadD from cad_consultor where IdAscendente = '" & IdPatrocinador & "' and PernaCadastro = 'D'" RsAs2.Open SQL,Conn,3,3 IF RsAs2("TotalCadD") < "1" Then PernaCadastro = "Ainda nao tem um cadastrado na perna Esquerda<br>" Set RsP = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdConsultor = '" & IdPatrocinador & "'" RsP.Open SQL,Conn,3,3 PernaCadastro = "Ainda nao tem um cadastrado na perna Direita: "&RsP("PernaCadastro") RsP.Close Set RsP = Nothing Else Set RsP = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdConsultor = '" & IdPatrocinador & "'" RsP.Open SQL,Conn,3,3 PernaCadastro = "Ja tem um cadastrado na perna Direita: "&RsP("PernaPadrao") RsP.Close Set RsP = Nothing End If Else Set RsP = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdConsultor = '" & IdPatrocinador & "'" RsP.Open SQL,Conn,3,3 PernaCadastro = "Ja tem um cadastrado na perna Esquerda: "&RsP("PernaPadrao") RsP.Close Set RsP = Nothing End if Set Rs = Server.CreateObject("adodb.recordset") SQL = "SELECT MAX(IdConsultor) AS ASCENDENTE from cad_consultor where PernaCadastro = 'e'" Rs.Open SQL,Conn,3,3 Response.Write PernaCadastro&"<br>Proximo cadastro o Ascendente sera: "&RS("Ascendente")&"<br><br><br>" Rs.Close Set Rs = Nothing '==================================================================== '==================================================================== 'REDE FORMATO LINEAR '==================================================================== '==================================================================== Response.Write"===================================================================<br>" Response.Write "REDE FORMATO LINEAR<BR>" Response.Write"===================================================================<br><br>" Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdConsultor = '" & IdPatrocinador & "'" Rs.Open SQL,Conn,3,3 Pat = Rs("IdConsultor") Set Rs2 = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdPatrocinador = '" & Pat & "' and IdConsultor <> '1'" Rs2.Open SQL,Conn,3,3 Response.Write Rs("Nome")&" | "&Rs("IdConsultor")&"<br>" Response.Write"=============================<br>" Do until RS2.EOF Pat2 = Rs2("IdConsultor") Response.Write "<font face=""Tahoma, Geneva, sans-serif"" color=""#006600"" size=""3px"">Primeira Linha >> "&Rs2("IdConsultor")&" - "&Rs2("PernaCadastro")&"</font><br>" Set Rs3 = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdPatrocinador = '" & Pat2 & "'" Rs3.Open SQL,Conn,3,3 Do until RS3.EOF Pat3 = Rs3("IdConsultor") Response.Write " |_<font face=""Tahoma, Geneva, sans-serif"" color=""#FF0000"" size=""3px"">Segunda Linha >> "&Rs3("IdConsultor")&" - "&Rs3("PernaCadastro")&"</font><br>" Set Rs4 = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdPatrocinador = '" & Pat3 & "'" Rs4.Open SQL,Conn,3,3 Do until RS4.EOF Pat4 = Rs4("IdConsultor") Response.Write " |_<font face=""Tahoma, Geneva, sans-serif"" color=""#0066FF"" size=""3px"">Terceira Linha >> "&Rs4("IdConsultor")&" - "&Rs4("PernaCadastro")&"</font><br>" Set Rs5 = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdPatrocinador = '" & Pat4 & "'" Rs5.Open SQL,Conn,3,3 Do until RS5.EOF Response.Write " |_<font face=""Tahoma, Geneva, sans-serif"" color=""#CC6600"" size=""3px"">Quarta Linha >> "&Rs5("IdConsultor")&" - "&Rs5("PernaCadastro")&"</font><br>" RS5.movenext loop Rs5.Close Set Rs5 = Nothing RS4.movenext loop Rs4.Close Set Rs4 = Nothing RS3.movenext loop Rs3.Close Set Rs3 = Nothing RS2.movenext loop Rs2.Close Set Rs2 = Nothing '==================================================================== '==================================================================== 'REDE FORMATO BINÁRIO '==================================================================== '==================================================================== Response.Write"<br><br>" Response.Write"===================================================================<br>" Response.Write "REDE FORMATO BINÁRIO<BR>" Response.Write"===================================================================<br><br>" 'CABEÇA DA REDE Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdConsultor = '" & IdPatrocinador & "'" Rs.Open SQL,Conn,3,3 IdCabeca = Rs("IdConsultor") NomeCabeca = Rs("PernaCadastro") Rs.Close Set Rs = Nothing 'PRIMEIRA LINHA DO LADO ESQUERDO DA REDE Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdCabeca & "' and PernaCadastro = 'E'" Rs.Open SQL,Conn,3,3 If Rs.Eof Then IdLinhaUmE = "Espaço Vago" NomeLinhaUmE = "" Else IdLinhaUmE = Rs("IdConsultor") NomeLinhaUmE = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'PRIMEIRA LINHA DO LADO DIREITO DA REDE Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdCabeca & "' and PernaCadastro = 'D' and IdConsultor <> '" & IdCabeca & "'" Rs.Open SQL,Conn,3,3 If Rs.eof then IdLinhaUmD = "Espaço Vago" NomeLinhaUmD = "" Else IdLinhaUmD = Rs("IdConsultor") NomeLinhaUmD = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'SEGUNDA LINHA DO LADO ESQUERDO FORA Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaUmE & "' and PernaCadastro = 'E'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaDoisEE = "Espaço Vago" NomeLinhaDoiEE = "" Else IdLinhaDoisEE = Rs("IdConsultor") NomeLinhaDoiEE = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'SEGUNDA LINHA DO LADO ESQUERDO DENTRO Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaUmE & "' and PernaCadastro = 'D'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaDoisED = "Espaço Vago" NomeLinhaDoiED = "" Else IdLinhaDoisED = Rs("IdConsultor") NomeLinhaDoiED = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'SEGUNDA LINHA DO LADO DIREITO FORA Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaUmD & "' and PernaCadastro = 'D'" Rs.Open SQL,Conn,3,3 If Rs.Eof then IdLinhaDoisDD = "Espaço Vago" NomeLinhaDoiDD = "" Else IdLinhaDoisDD = Rs("IdConsultor") NomeLinhaDoiDD = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'SEGUNDA LINHA DO LADO DIREITO DENTRO Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaUmD & "' and PernaCadastro = 'E'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaDoisDE = "Espaço Vago" NomeLinhaDoiDE = "" Else IdLinhaDoisDE = Rs("IdConsultor") NomeLinhaDoiDE = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'TERCEIRA LINHA DO LADO ESQUERDO FORA Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaDoisEE & "' and PernaCadastro = 'E'" Rs.Open SQL,Conn,3,3 If Rs.eof then IdLinhaTresEE = "Espaço Vago" NomeLinhaTresEE = "" Else IdLinhaTresEE = Rs("IdConsultor") NomeLinhaTresEE = Rs("PernaCadastro") End IF Rs.Close Set Rs = Nothing 'TERCEIRA LINHA DO LADO ESQUERDO DENTRO Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaDoisEE & "' and PernaCadastro = 'D'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaTresED = "Espaço Vago" NomeLinhaTresED = "" Else IdLinhaTresED = Rs("IdConsultor") NomeLinhaTresED = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'TERCEIRA LINHA DO LADO ESQUERDO DENTRO Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaDoisED & "' and PernaCadastro = 'D'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaTresEDD = "Espaço Vago" NomeLinhaTresEDD = "" Else IdLinhaTresEDD = Rs("IdConsultor") NomeLinhaTresEDD = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'TERCEIRA LINHA DO LADO ESQUERDO FORA Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaDoisED & "' and PernaCadastro = 'E'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaTresEDE = "Espaço Vago" NomeLinhaTresEDE = "" Else IdLinhaTresEDE = Rs("IdConsultor") NomeLinhaTresEDE = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'TERCEIRA LINHA DO LADO DIREITO FORA Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaDoisDD & "' and PernaCadastro = 'D'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaTresDDD = "Espaço Vago" NomeLinhaTresDDD = "" Else IdLinhaTresDDD = Rs("IdConsultor") NomeLinhaTresDDD = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'TERCEIRA LINHA DO LADO DIREITO DENTRO Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaDoisDD & "' and PernaCadastro = 'E'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaTresDDE = "Espaço Vago" NomeLinhaTresDDE = "" Else IdLinhaTresDDE = Rs("IdConsultor") NomeLinhaTresDDE = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'TERCEIRA LINHA DO LADO DIREITO DIREITO DENTRO Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaDoisDE & "' and PernaCadastro = 'D'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaTresDED = "Espaço Vago" NomeLinhaTresDED = "" Else IdLinhaTresDED = Rs("IdConsultor") NomeLinhaTresDED = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing 'TERCEIRA LINHA DO LADO DIREITO ESQUERDO DENTRO Set Rs = Server.CreateObject("adodb.recordset") SQL = "select * from cad_consultor where IdAscendente = '" & IdLinhaDoisDE & "' and PernaCadastro = 'E'" Rs.Open SQL,Conn,3,3 If Rs.eof Then IdLinhaTresDEE = "Espaço Vago" NomeLinhaTresDEE = "" Else IdLinhaTresDEE = Rs("IdConsultor") NomeLinhaTresDEE = Rs("PernaCadastro") End If Rs.Close Set Rs = Nothing %> <table width="96%" border="0" cellpadding="10"> <tr> <td colspan="8" align="center" bgcolor="#0099FF"><%=IdCabeca%></td> </tr> <tr> <td colspan="4" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaUmE%>"><%=IdLinhaUmE%></a></td> <td colspan="4" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaUmD%>"><%=IdLinhaUmD%></a></td> </tr> <tr> <td colspan="2" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaDoisEE%>"><%=IdLinhaDoisEE%></a></td> <td colspan="2" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaDoisED%>"><%=IdLinhaDoisED%></a></td> <td colspan="2" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaDoisDE%>"><%=IdLinhaDoisDE%></a></td> <td colspan="2" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaDoisDD%>"><%=IdLinhaDoisDD%></a></td> </tr> <tr> <td width="12%" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaTresEE%>"><%=IdLinhaTresEE%></a></td> <td width="12%" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaTresED%>"><%=IdLinhaTresED%></a></td> <td width="12%" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaTresEDE%>"><%=IdLinhaTresEDE%></a></td> <td width="12%" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaTresEDD%>"><%=IdLinhaTresEDD%></a></td> <td width="12%" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaTresDEE%>"><%=IdLinhaTresDEE%></a></td> <td width="12%" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaTresDED%>"><%=IdLinhaTresDED%></a></td> <td width="12%" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaTresDDE%>"><%=IdLinhaTresDDE%></a></td> <td width="12%" align="center" bgcolor="#0099FF"><a href="TesteP.asp?Proximo=<%=IdLinhaTresDDD%>"><%=IdLinhaTresDDD%></a></td> </tr> </table> <br /><br /> è isto ai, como falei ainda estou em cima da parte de como cadastrar. pois preciso do ID do Ascendente da pessoa qu estará cadastrando, e o ID da pessoa que estara cadastrando, se fosse um sistema linear simples o ascendete sempre seria o proprio cara que esta cadastrando o novo cadastrado, mas como é binário nem sempre será o mesmo., e o outro fatro que atrapalha é que o cara que esta cadastrando nunca pode cadastrar alguém nas pernas internas somente nas externas. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Fevereiro 13, 2009 Parece-me uma questão de um modelo de rede de relacionamento , a SqlMagasine publicou um artigo sobre isto uns meses atrás pode ter ajudar, pis tem a modelagem e a base matemática envolvida. Outra coisa boa e ver os modelos e algoritmos de teoria de grafos Palavras chaves Dijkstra Grafos Não são modelos simples todavia , mas é um caminho para pensar seu modelo. Compartilhar este post Link para o post Compartilhar em outros sites
kania 0 Denunciar post Postado Fevereiro 13, 2009 Valeu a dica MOtta vou dar uma olhada no modelo de Grafos e ver se ocnsigo tbm a materia da SqlMagazine Compartilhar este post Link para o post Compartilhar em outros sites
Alex_poty 0 Denunciar post Postado Fevereiro 13, 2009 Bom, Nem lí tudo que você postou porque acho que tecnicamente podemos pensar diferente e entregar o resultado da forma que querem. Mas de cara tem algo errado na sua modelagem. Se você vai criar relacionamentos e/ou consultas com certos campos, estes precisam ter índices. `IdConsultor` int(11) NOT NULL AUTO_INCREMENT, `IdPatrocinador` int(11) DEFAULT NULL, `IdAscendente` int(11) DEFAULT NULL, `PernaCadastro` varchar(1) DEFAULT NULL COMMENT 'D = Direita, E = Esquerda', `PernaPadrao` varchar(1) DEFAULT NULL COMMENT 'D = Direita, E = Esquerda', Quando você faz essa consulta SELECT MAX(IdConsultor) as IdConsultor FROM cad_consultor WHERE IdPatrocinador = 1 and PERNACADASTRO = 'E'; precisa indexar essas dois campos, portanto não pode deixar campos indexados como NULL, sempre deve ser NOT NULL e pode usar DEFAULT ''. `IdConsultor` int(11) NOT NULL AUTO_INCREMENT, `IdPatrocinador` int(11) NOT NULL DEFAULT '0', `IdAscendente` int(11) NOT NULL DEFAULT '0', `PernaCadastro` varchar(1) NOT NULL DEFAULT '' COMMENT 'D = Direita, E = Esquerda', `PernaPadrao` varchar(1) NOT NULL DEFAULT '' COMMENT 'D = Direita, E = Esquerda', Pra simplificar, porque você não pensa na ordem das coisas? primeiro você consulta o GRUPO, depois o IDINDICADOR, depois IDCLIENTE e por último IDASCENDENTE? Assim você poderia usar o DB assim: select max(IDASCENDENTE) from tabela where IDCLIENTE='clienteescolhido' and IDINDICADOR='indicadorescolhido' and GRUPO='grupoescolhido'; Eu entendi que no momento do cadastro a pessoa escolhe o GRUPO, o INDICADOR? só não entendi ainda se ele escolhe o CLIENTE. Mas diante mão, você deve criar tabelas separadas para conseguir isso de forma mais simples. create table JUNTARTUDO ( GRUPO enum('D','E','I') NOT NULL default 'I' COMMENT 'D/Direita-E/Esquerda-I/Indefinido', IDINDICADOR bigint(11) NOT NULL default '0', IDCLIENTE bigint(11) NOT NULL default '0', IDASCENDENTE bigint(11) NOT NULL default '0', primary key(GRUPO,IDINDICADOR,IDCLIENTE,IDASCENDENTE), index indIDINDICADOR(IDINDICADOR), index indIDCLIENTE(IDCLIENTE), index indIDASCENDENTE(IDASCENDENTE) ); E na tabela de cadastro, você poderia comparar valores como flags, algo assim: Se ele tiver o IDCLIENTE<>0 significa que é cliente, se ele tiver IDINDICADOR<>0 significa que ele é indicador e se ele tiver IDCLIENTE<>0 e IDINDICADOR<>0 significa que ele é os dois (cliente e indicador) e assim por diante. Quando você fizer a query, ficará molezinha encontrar o que quer, entendeu? Basta apenas relacionar os IDs. Na minha opinião é muito simples e de fato você trabalhar melhor na sua modelagem! Valewww... Compartilhar este post Link para o post Compartilhar em outros sites
kania 0 Denunciar post Postado Fevereiro 13, 2009 Opa Alex, então, entendi sua colocação, como tenho dado as prioridades: 1 - Verifico quem o PAtrocinador (pessoa que esta indicando o novo cadastrado, este eu pego por session, ou por um request.form) 2 - Verifico em que posição da rede ele vai entrar, buscando o Ascendente dele 3 - Verifico em que grupo, perna (Direita ou Esquerda) ele estara entrando, neste caso a pessoa que já for cadastrada poderá escolher pela sua area de associado se quer deixar fixado um grupo determinado, exemplo, que todos os novos cadastros sempre caiam no grupo da esquerda, assim toda vez que alguem for cadastrar com aquela pessoa o grupo será pego pelo que foi determinado na configuração pelo usuário. Tendo estes 3 parametros eu já consigo cadastrar o novo membro. Só que to me batendo é para pegar o ID do Ascendente, pois como falei eu preciso fazer um select que vá até o final da rede, buscando o maior ID que foi cadastrado no grupo (esquerdo ou direito), porem o select trem que obrigatoriamente excluir da pesquisa os cadastros que forma efetuados por dentro da rede, naõ sei se to conseguindo explicar, mas se você ver a figura da para entender melhor, veja: O ID !: é o cabeça, podemos dizer que o cara que logou dentro da sua area de afiliado, é o cabeça desta rede Os Ids: 2, 4, 5, 8 - fazem parte do grupo da esquerda do ID 1 Os Ids: 3, 6 - fazem parte do grupo da direita do ID 1 Os outros IDs fazem parte da equipe porem são contados como pernas internas na rede, e não podem ser contado na hora de verificar o MAX id, ai vem a pergunta, como consigo no select excluir da pesquiza estes IDs? Uma observação, Nunca o ID 1 por exmplo poderá efetuar um cadastro nestas redes internas, somente nas externas, e no exmplo da figura se ele fosse cadastrar alguém agora, teria obrigatóriamente de estar ou abaixo do ID 8 ou do ID 6 Compartilhar este post Link para o post Compartilhar em outros sites
Alex_poty 0 Denunciar post Postado Fevereiro 13, 2009 Acho que encontrei uma forma de te ajudar. Na tabela cad_consultor você terá todo mundo cadastrado ok? create table JUNTARTUDO ( GRUPO enum('D','E','I') NOT NULL default 'I' COMMENT 'D/Direita-E/Esquerda-I/Indefinido', IDINDICADOR bigint(11) NOT NULL default '0', IDCLIENTE bigint(11) NOT NULL default '0', IDASCENDENTE bigint(11) NOT NULL default '0', CPFCNPJ varchar(18) NOT NULL default '', primary key(GRUPO,IDINDICADOR,IDCLIENTE,IDASCENDENTE), index indIDINDICADOR(IDINDICADOR), index indIDCLIENTE(IDCLIENTE), index indIDASCENDENTE(IDASCENDENTE), index indCPFCNPJ(CPFCNPJ) ); Nesta tabela você teria os seguintes dados inicialmente porque a empresa já é o primeiro membro. insert into JUNTARTUDO values ('D','1','1','1','00111222000101'); insert into JUNTARTUDO values ('E','1','1','1','00111222000101'); Para o próximo registro, basta fazer um select baseado no grupo que o usuário escolheu e no indicador, ou seja, ele escolhe o grupo D, consequentemente, você fará a query com max(IDASCENDENTE) quando o grupo for D, trabalha esses dados e armazena o segundo membro. insert into JUNTARTUDO values ('D','1','1','2','00011122201'); e assim sucessivamente. insert into JUNTARTUDO values ('D','1','1','3','11122233301'); Quando entrar um novo indicador, você fará a query com max(IDINDICADOR) para o grupo E que ele escolheu. insert into JUNTARTUDO values ('E','2','1','1','22233344401'); e por ai vai. insert into JUNTARTUDO values ('E','2','1','2','33344455501'); Quando entrar um novo cliente, você fará a query com max(IDCLIENTE) para o grupo D que ele escolheu. insert into JUNTARTUDO values ('D','1','2','1','44455566601'); insert into JUNTARTUDO values ('D','1','2','2','55566677701'); Entendeu? resolve? Valewww... Compartilhar este post Link para o post Compartilhar em outros sites
Alex_poty 0 Denunciar post Postado Fevereiro 13, 2009 Não esqueça que sua tabela cad_consultor precisa ser retrabalhada. No post anterior acrescentei o campo CPFCNPJ da tabela JUNTARTUDO que deve se relacionar com CpfCnpj da tabela cad_consultor, portanto, lá, você deve criar um índice para este campo. Acho que está fácil de entender. Valewww... Compartilhar este post Link para o post Compartilhar em outros sites
kania 0 Denunciar post Postado Fevereiro 13, 2009 Fera efetuei as modificações sugeridas, porem não entendi a montagem que você fez, da tabela JUNTARTUDOpis ela cria IDs duplicados em todos so casos, você recomenda fazer o filtro pelo CPFCNPJ? isto? Compartilhar este post Link para o post Compartilhar em outros sites
Alex_poty 0 Denunciar post Postado Fevereiro 13, 2009 Se você modelar direitinho não haverá duplicidade, acrescente o CPFCNPJ no índice primário primary key(GRUPO,IDINDICADOR,IDCLIENTE,IDASCENDENTE,CPFCNPJ) assim é impossível duplicar. Quanto aos filtros, veja como tratar cada dado. Primeiro filtre pro GRUPO que é o que o usuário escolheu (assim eu entendi). Então você já matou um parâmetro ok? Significa que você já sabe em que lado trabalhar, D ou E. Em seguida, defina que outros dados filtrar. Eu entendi que quem se cadastra é o IDASCENDENTE certo? Portanto ele vai dizer quem foi o indicador. Dessa forma você passou a ter 2 parâmetros e assim sucessivamente. No final você verá que sobrará quase nada pra você fazer, pois o CPJCNPJ é outro dado fornecido pelo usuário que está se cadastrando. Por ai você percebe que sobraram apenas IDCLIENTE que apenas não entendi esse cara. Faça um teste de mesa de forma simples com dados fictícios que ficará facil de fazer as filtragens. Cadastre uns 10 registros na tabela cad_consultor e compare que fica mais fácil enxergar dados relacionados. SUAEMPRESA 00111222000101 JOSÉ 00011122201 MANOEL 11122233301 MARIA 22233344401 ANTONIO 33344455501 FELIPE 44455566601 MARCOS 66677788801 CLAUDIO 77788899901 RICARDO 88899900011 GULIHERMINA 99900011101 JOÃO 00011122202 OUTRAEMPRESA 11222333000102 Na tabela JUNTARTUDO, junte tudo, distribuído pelos IDs e GRUPOS, relacionando CPFCNPJ com CpfCnpj, dai você vai encontrar a forma de filtrar sem encontrar erros. Valewww... Compartilhar este post Link para o post Compartilhar em outros sites
Alex_poty 0 Denunciar post Postado Fevereiro 13, 2009 Se você ainda encontrar dificuldade, posta pra mim a descrição de tudo que você quer fazer sem mencionar nada tecnicamente. Exemplo: 1 - O usuário acessa a internet e escolhe um lado que quer se cadastrar. 2 - O deve informar seu CPFCNPJ. 3 - O IDx deve ser definido. 4 - O IDy deve ser escolhido. Enfim, tudo que deve ser feito e que resultado você quer chegar, dê preferência a dar nome aos bois assim: O usuário1 deve ser ascendente do usuario5, o usuário3 deve ser indicado pelo usuário2 e assim por diante. Espero poder te ajudar. Valewww... Compartilhar este post Link para o post Compartilhar em outros sites
kania 0 Denunciar post Postado Fevereiro 13, 2009 Na verdade Alex, é assim 1 - Patrocinador (IDPATROCINADOR) este é o cara que esta cadastrado o novo consultor 2 - O novo cadastrado que é o IDCONSULTOR na tabela cad_consultor 2- O Ascendente, que é quem vai estar logo acima do novo cadastrado na rede 3 - O grupo (esquerdo ou Direito) da rede conforme a escolha do Patrocinador Para cadastrar um novo "Afiliado" na rede, antes devemos seguir algumas informações 1 - Quem esta cadastrando - IDPATROCINADOR 2- Em que grupo vai ser cadastrado (esquerdo ou direito, este eu epgo automaticamente das configurações do banco no campo PERNAPADRAO. a não sqer que seja um derramamento, que é quando o cadastro vem de uma pessoa que esta acima na rede, exemplo o ID 1 na figura cadastra lguém no grupo esquerdo, este devera derramar abaixo do ID 8 3- Saber quem será o Ascendente deste novo "Afiliado" seguindo o exmplo anterio o Ascendente seria o ID 8 4 - Preenche todo o restante dos dados no formulario. Comm estas informações ue já consigo cadastrar na rede. Compartilhar este post Link para o post Compartilhar em outros sites
kania 0 Denunciar post Postado Fevereiro 13, 2009 Opa desculpa só agora vi que você tinha mando outro post.. foi mal, vamos lá novamente 1 - Usuário acessa o site e clica em cadastrar 2- no cmapo patrocinador coloquei uma rotina em Ajax que verifica o ID digitado se exisite ou não no banco, então o primeiro item que eu pego é o IDPATROCINADOR 3- Ele escolhe se é pessoa física ou juridica 4 - Aceita o contrato da empresa (até aqui tudo em uma mesma pagina) 5 - Quando ele for para a proxima pagina eu faço varias verificações, se todos os campos da pagina anterior forma preenchido e corretamente caso contrario ele retorna para pagina anterior, tudo correto eu tenho agora que verificar qual a configuração padrão para grupo (CAMPO PERNAPADRAO NO BANCO) do patrocinador e verificar quem será dentro deste grupo o ASCENDENTE do novo cadastrado,. 6 - Agora ele vai preencher o restante dos dados, as informações anteriores eu gravo em uma Session (em ASP) 7 - O sistema tem que cadastrar no banco as informações, IDCONSULTOR (auto Incremento), IDPATROCINADOR, IDASCENDENTE, PERNACADASTRO, E TODAS AS OUTRAS INFORMAÇÕES PREENCHIDAS NO FORM DE CADASTRO. Compartilhar este post Link para o post Compartilhar em outros sites