Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Alteração de registro aproveitando dados retornados pela busca: "Error: Render error. Exception: ReferenceError: livro is not defined"

Boa tarde, agora na implementação da alteração, consigo listar o título a ser alterado porém recebo a mensagem "Error: Render error. Exception: ReferenceError: livro is not defined" desta vez ao submeter o novo valor para título, estou tentando persistir a variável original através de um input hidden aproveitando a variável que já é utilizada para listar o título retornado pela busca, desta forma os valores original e o novo serão utilizados pela query que atualizará o valor para título, entretanto o input hidden não parece conseguir ler a variável original que exibe na página os dados do livro buscado, seguem os códigos:

Há outra forna de manter as duas variáveis em memória para utilização na query de atualização ? Obrigado.

Titulo Recuperado pela Busca para Alteracao:

    <table>
        <tr>
            <td>ID</td>
            <td>Título</td>
            <td>Preco</td>
            <td>-----</td>
            <td>Descricao</td>
        </tr>
            <tr for (livro in data.livros)>
            <td>${livro.id}</td>
            <td>${livro.titulo}</td>
            <td>${livro.preco}</td>
            <td>${livro.descricao}</td>
        </tr>

    </table> 
    <form action="/livros/manutencaoLivros/alteracaoLivros/resultadoAlteracaoPorTitulo" method="post">
        <input type="hidden" id="titulo" name="titulo" value="${livro.titulo}"/>
            <div>
                <label for="titulo">Informe o novo valor do Titulo:</label>
                <input type="text" id="novoTitulo" name="novoTitulo" placeholder="coloque o novo titulo" />
            </div>
        <input type="submit" value="Alterar" />
    </form>
</body> 
alteraRegistroPorTitulo001(livro){
    return new Promise((resolve, reject) => {
        console.log("Entrou na funcao de alteracao de livros <<<<<<<<<<<<<<<<<<<<<");
// A variável com o título original não é preenchida aproveitando o código da listagem
        console.log("Variavel com titulo original  ---->>>> " + [ livro.titulo ] );
        console.log("Variavel com titulo novo  ---->>>> " + [ livro.novoTitulo ] );

        this._db.all(

            "UPDATE livros SET titulo=? WHERE titulo =? ",  [ livro.titulo, livro.novoTitulo ],

            (erro, resultados) => {
                if (erro) return reject("Nao foi possivel listar os livros.");
                    return resolve(resultados);
            }    
        )
    })
}
4 respostas

Ao fazer o update utilize a chave primaria da tabela pois ela consegue identificar de forma única e precisa cada linha da tabela. Ao invés de "UPDATE livros SET titulo=? WHERE titulo =? " use "UPDATE livros SET titulo=? WHERE id=? ". Para implementar isso você pode colocar o id dentro do input hidden.

Boa noite, atualizando o tópico, cheguei a duas possibilidades, utilizando a variável postada em campo hidden no form ou utilizando a variável com o valor original gravado e repassado para o método que efetua a atualização no banco, na segunda opção, a variável até é reconhecida e postada no console, porém não é reconhecida dentro da query, então ficam duas perguntas ? Para as duas abordagens, o que está faltando ? Acredito que as duas funcionariam, correto ? E qual das abordagens seria a melhor para o projeto ? OBS.: Agradeço a resposta do colega Licas Miguel, ainda estou começando a me familiarizar com as querys e assim que evoluir mais tentatei a abordagem consultando pelo ID.

Seguem os códigos, grato:

Primeira abordagem abaixo:

  var valorOriginalDeTitulo = "";
  exports.valorOriginalDeTitulo = valorOriginalDeTitulo;

alteraRegistroPorTitulo001(livro){


    return new Promise((resolve, reject) => {
        console.log("Entrou na funcao de alteracao de livros <<<<<<<<<<<<<<<<<<<<<");
        console.log("Variavel com titulo original  ---->>>> " + [ livro.titulo ] );
        console.log("Variavel com titulo novo  ---->>>> " + [ livro.novoTitulo ] );
        console.log("Valor original do titulo passado para o metodo de alteracao  ---->>>> " +  valorOriginalDeTitulo );

        this._db.get(

            // ESSA QUERY FUNCIONOU ##############################################################
            // "UPDATE livros SET titulo=? WHERE titulo =? ",  [ livro.novoTitulo , "123028" ], 
        // Query que ainda não reconhece a variável valorOriginalDeTitulo
            "UPDATE livros SET titulo=? WHERE titulo =? ",  [ livro.novoTitulo , valorOriginalDeTitulo ], 

            (erro, resultados) => {
                if (erro) return reject("Nao foi possivel listar os livros.");
                    return resolve(resultados);
            }    
        )
    })
}

Segunda abordagem abaixo:

Titulo Recuperado pela Busca para Alteracao:

    <table>
        <tr>
            <td>ID</td>
            <td>Título</td>
            <td>Preco</td>
            <td>-----</td>
            <td>Descricao</td>
        </tr>
            <tr for (livro in data.livros)>
            <td>${livro.id}</td>
            <td>${livro.titulo}</td>
            <td>${livro.preco}</td>
            <td>${livro.descricao}</td>
        </tr>



    </table> 
    <form action="/livros/manutencaoLivros/alteracaoLivros/resultadoAlteracaoPorTitulo" method="post">
        <input type="hidden" id="titulo" name="titulo" value="${livro.titulo}"/>
            <div>
                <label for="titulo">Informe o novo valor do Titulo:</label>
                <input type="text" id="novoTitulo" name="novoTitulo" placeholder="coloque o novo titulo" />
            </div>
        <input type="submit" value="Alterar" />
    </form>
</body> 

Atualizando novamente o tópico, o método que utiliza a variável com o valor original gravado e repassado para o método que efetua a atualização no banco funcionou "parcialmente", abaixo segue o código, para apenas números a atualização funciona normalmente, entretanto ao, por exemplo, modificar o registro de 1234 para 12xxxx34 a atualização é realizada, se tento retornar de 12xxxx34 para 1234 o comando não modifica o registro, é necessário especificar o tipo da variável que armazena o valor do novo registro ? Segue o código abaixo, grato.

     alteraRegistroPorTitulo001(livro){

    return new Promise((resolve, reject) => {
        console.log("Entrou na funcao de alteracao de livros <<<<<<<<<<<<<<<<<<<<<");
        console.log("Variavel com titulo original  ---->>>> " + [ livro.titulo ] );
        console.log("Variavel com titulo novo  ---->>>> " + [ livro.novoTitulo ] );
        console.log("Valor original do titulo passado para o metodo de alteracao  ---->>>> " +  valorOriginalDeTitulo );
        this._db.get(
            "UPDATE livros SET titulo=? WHERE titulo =? ",  [ livro.novoTitulo , + valorOriginalDeTitulo ], 
            (erro, resultados) => {
                if (erro) return reject("Nao foi possivel listar os livros.");
                    return resolve(resultados);
            }    
        )
    })
}

}

var valorOriginalDeTitulo = "";
exports.valorOriginalDeTitulo = valorOriginalDeTitulo;
module.exports = livroDao;

listaResultadoBuscaPorTitulo001(livro){

        return new Promise((resolve, reject) => {
            console.log("001 - Entrou na funcao de listagem de livros da busca <<<<<<<<<<<<<<<<<<<<<");
            console.log("002 - Variavel carregada corretamente na listagem da busca  ---->>>> " + [ livro.titulo ] );
            this._db.all(
                //"SELECT * FROM livros WHERE titulo = ?",  [ livro.titulo ],
                valorOriginalDeTitulo = ("SELECT * FROM livros WHERE titulo = ?",  [ livro.titulo ]),
                (erro, resultados) => {
                    if (erro) return reject("Nao foi possivel listar os livros.");
                        return resolve(resultados),
                        console.log("001 - Armazenou o valor original do registro -->> " + valorOriginalDeTitulo);
                }    
            ) //_db.close();
        }
    )
}
solução!

Boa tarde, agora funcionou, a variável que recebia o título original para persistir até a alteração estava recebendo o resultado da query, bastou modificar para receber diretamente o valor já armazenado inserido pelo usuário, segue o código abaixo, grato:

                "SELECT * FROM livros WHERE titulo = ?",  [ livro.titulo ],
                // valorOriginalDeTitulo = ("SELECT * FROM livros WHERE titulo = ?",  [ livro.titulo ]),
                valorOriginalDeTitulo = livro.titulo ,

E no método que atualiza o registro a query ficou assim: 

"UPDATE livros SET titulo=? WHERE titulo =? ",  [ livro.novoTitulo , valorOriginalDeTitulo ],