(HTML/JS)基于对数据库的 JSON 响应创建报告的按钮不起作用

问题描述 投票:0回答:1

拜托,我要疯了。我目前正在使用 PostGreSQL 做一个数据库项目,使用 Python Flask 作为后端,使用 HTML/CSS/Javascript 作为前端。但是在应该有两个按钮来创建报告的页面之一上,其中一个不起作用,当我单击它时,它会在“检查元素”中给出以下错误消息:

未捕获(承诺中)类型错误:无法读取 null 的属性(读取“值”) 在 fetchProdutoVendidoReport (script.js:50:61) 在 HTMLButtonElement.onclick

每当我尝试解决此问题时,例如向 HTML 表单提供“id”,同一页面中的其他按钮/请求都会失败,并且两者都会给出 500:内部服务器错误。

有人可以帮助我吗?这是上述页面的 HTML 正文(我是巴西人,所以很多内容都是葡萄牙语,但我希望破译问题不会太难):

<body>

    <div id="header"></div>
    <script src="/frontend/components/header/header.js"></script>

    <h1>Gerar Relatórios</h1>

    <!-- Formulário para Relatório de Pedido Cliente -->
    <h2>Relatório de Pedido Cliente</h2>
    <form id="pedidoClienteForm">
        <label>Categoria: <input type="text" id="categoria" name="categoria"></label><br>
        <label>Data Mínima: <input type="date" id="startDate" name="data_min"></label><br>
        <label>Data Máxima: <input type="date" id="endDate" name="data_max"></label><br>
        <label>Fabricante: <input type="text" id="marca" name="fabricante"></label><br>
        <label>Método de Pagamento: <input type="text" id="metodoPagamento" name="metodo"></label><br>
        <label>Preço Mínimo: <input type="number" id="precoMin" name="preco_min"></label><br>
        <label>Preço Máximo: <input type="number" id="precoMax" name="preco_max"></label><br>
        <button type="button" onclick="fetchPedidoClienteReport()">Gerar Relatório de Pedido Cliente</button>
    </form>
    <div id="pedidoClienteResultado"></div>

    <h2>Resultados</h2>
    <table id="TabelaPedidoCliente">
        <thead>
            <tr>
                <th>Produto</th>
                <th>Categoria</th>
                <th>Marca</th>
                <th>Total Vendido</th>
                <th>Receita Total</th>
                <th>Método de Pagamento</th>
                <th>Data de Venda</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

    <!-- Formulário para Relatório de Produto Vendido -->
    <h2>Relatório de Produto Vendido</h2>
    <form id="produtoVendidoForm">
        <label>Data Mínima: <input type="date" name="data_min"></label><br>
        <label>Data Máxima: <input type="date" name="data_max"></label><br>
        <label>Preço Mínimo: <input type="number" name="preco_min"></label><br>
        <label>Preço Máximo: <input type="number" name="preco_max"></label><br>
        <button type="button" onclick="fetchProdutoVendidoReport()">Gerar Relatório de Produto Vendido</button>
    </form>
    <div id="produtoVendidoResultado"></div>

    <h2>Resultados</h2>
    <table id="TabelaProdutoVendido">
        <thead>
            <tr>
                <th>Produto</th>
                <th>Faixa de Preço</th>
                <th>Total Vendido</th>
                <th>Receita Total</th>
                <th>Método de Pagamento</th>
            </tr>
        </thead>
        <tbody></tbody>
    </table>

    <script src="/frontend/pages/relatorios/script.js"></script>
</body>

这是 JS:

async function fetchPedidoClienteReport() {
        const startDate = document.getElementById('startDate').value;
        const endDate = document.getElementById('endDate').value;
        const categoria = document.getElementById('categoria').value;
        const marca = document.getElementById('marca').value;
        const precoMin = document.getElementById('precoMin').value;
        const precoMax = document.getElementById('precoMax').value;
        const metodoPagamento = document.getElementById('metodoPagamento').value;
        
        const url = `http://127.0.0.1:8000/relatorio/pedido_cliente?categoria=${categoria}&data_min=${startDate}&data_max=${endDate}&fabricante=${marca}&metodo=${metodoPagamento}&preco_min=${precoMin}&preco_max=${precoMax}`;
            try {
                // Envia a requisição para o backend
                const response = await fetch(url, {
                    method: 'GET'
                });
                
                // Converte a resposta para JSON
                const data = await response.json();
                
                // Atualiza a tabela com os dados recebidos
                    const tbody = document.getElementById('TabelaPedidoCliente').getElementsByTagName('tbody')[0];
        
                    // Limpa a tabela antes de preencher com os novos dados
                    tbody.innerHTML = '';
    
                    function formataData(dateString) {
                        const date = new Date(dateString);
                        return date.toLocaleDateString('pt-BR'); // Formato 'DD/MM/YYYY'
                    }
    
                    // Preenche a tabela com os dados do relatório
                    data.forEach(item => {
                        const row = tbody.insertRow();
                        
                    row.insertCell(0).textContent = item.nome;        // nome do produto
                    row.insertCell(1).textContent = item.categoria;      // categoria do produto
                    row.insertCell(2).textContent = item.fabricante;     // fabricante do produto
                    row.insertCell(3).textContent = item.quantidade;  // total vendido
                    row.insertCell(4).textContent = item.total_venda;  // receita total
                    row.insertCell(5).textContent = item.metodo;         // método de pagamento
                    row.insertCell(6).textContent = formataData(item.data);     // data da venda
                    })
            } catch (error) {
                console.error('Erro ao gerar o relatório:', error);
            }
    }
    
    // Função para buscar o Relatório de Produto Vendido
    async function fetchProdutoVendidoReport() {
        const DataComeco = document.getElementById('DataComeco').value;
        const DataFinal = document.getElementById('DataFinal').value;
        const Preco_Min = document.getElementById('preco_Min').value;
        const Preco_Max = document.getElementById('preco_Max').value;
        
        const url = `http://127.0.0.1:8000/relatorio/produto_vendido?data_min=${DataComeco}&data_max=${DataFinal}&preco_min=${Preco_Min}&preco_max=${Preco_Max}`;
            try {
                // Envia a requisição para o backend
                const response = await fetch(url, {
                    method: 'GET'
                });
                
                // Converte a resposta para JSON
                const data = await response.json();
                
                // Atualiza a tabela com os dados recebidos
                    const tbody = document.getElementById('TabelaProdutoVendido').getElementsByTagName('tbody')[0];
    
                    // Limpa a tabela antes de preencher com os novos dados
                    tbody.innerHTML = '';
    
                    // Preenche a tabela com os dados do relatório
                    data.forEach(item => {
                        const row = tbody.insertRow();
                        
                    row.insertCell(0).textContent = item.nome;        // nome do produto
                    row.insertCell(1).textContent = item.faixa_preco;      // categoria do produto
                    row.insertCell(2).textContent = item.total_vendido;     // fabricante do produto
                    row.insertCell(3).textContent = item.receita_total;  // total vendido
                    row.insertCell(4).textContent = item.metodo;         // método de pagamento
                    })
            } catch (error) {
                console.error('Erro ao gerar o relatório:', error);
            }
    }
javascript html sql flask button
1个回答
0
投票

在第二个表格中添加缺少的 ID。

<form id="produtoVendidoForm">
    <label>Data Mínima: <input type="date" id="DataComeco" name="data_min"></label><br>
    <label>Data Máxima: <input type="date" id="DataFinal" name="data_max"></label><br>
    <label>Preço Mínimo: <input type="number" id="preco_Min" name="preco_min"></label><br>
    <label>Preço Máximo: <input type="number" id="preco_Max" name="preco_max"></label><br>
    <button type="button" onclick="fetchProdutoVendidoReport()">Gerar Relatório de Produto Vendido</button>
</form>
© www.soinside.com 2019 - 2024. All rights reserved.