Avatar billede madseksperten Nybegynder
09. marts 2014 - 10:28 Der er 21 kommentarer og
1 løsning

Loop igennem MySQL COLUMN

Hejsa.

Jeg har en Column i min MySQL database, som jeg gerne vile loope igennem, og så skal de addes sammen. Jeg har lavet en lille video hvor jeg viser hvad jeg mener:

https://www.youtube.com/watch?v=OrqpTt-YlBY&feature=youtu.be

Det er Day_hours og Day_minutes der skal ligges sammen i den periode man vælger. Jeg har en fiktiv COLUMN som hedder Allday_hours, hvor de hours and minutes ligges sammen i. Min kode lige nu vælger kun første column i min database, som det ses i videoen. Derfor skal jeg bruge en eller anden form for loop, som løber igennem alle Allday_hours i min database og ligger dem sammen.

Jeg laver min SELECT statement i en servlet, som ser sådan ud: Har i en ide til hvordan jeg kan gøre det?

Mvh Mads

package WorkPackage;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{

        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
                               
        try {

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(connectionURL, "root", "");
            String sql = "SELECT *, (Day_hours + (Day_minutes / 100)) AS Allday_hours FROM Workdata";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            ResultSet rs = pst.executeQuery(sql);
            String all_day_hours = null;   
             
            if(rs.next()){                                       
                all_day_hours = rs.getString("Allday_hours"); 
            }       
              res.setContentType("text/html;charset=UTF-8");           
            res.getWriter().write(all_day_hours);   
            pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            System.out.println(e);
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede madseksperten Nybegynder
09. marts 2014 - 13:31 #1
Den korrekte kode er:

package WorkPackage;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{

        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
                               
        try {

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(connectionURL, "root", "");
            String sql = "SELECT *, (Day_hours + (Day_minutes / 100)) AS Allday_hours FROM Workdata";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            ResultSet rs = pst.executeQuery(sql);
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += Float.parseFloat (rs.getString("Allday_hours"));
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);   
               
            pst.close();
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            System.out.println(e);
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede arne_v Ekspert
09. marts 2014 - 22:50 #2
Kunne Float.parseFloat (rs.getString("Allday_hours")) laves som rs.getFloat("Allday_hours")?
Avatar billede arne_v Ekspert
09. marts 2014 - 22:51 #3
Er du iovrigt sikker paa at:

Day_minutes / 100

ikke skal vaere:

Day_minutes / 60

?
Avatar billede madseksperten Nybegynder
09. marts 2014 - 23:32 #4
Hejsa igen Arne.

Det er rigtigt faktisk med /60. Jeg havde først tænkt at jeg skulle have 2 timer og så 15 minutter. Derfor dividerede jeg 15 med 100, så jeg fik 0,15. Når jeg prøver med getFloat før jeg en fejl med:

The method parseFloat(String) in the type Float is not applicable for the arguments (float)

Jeg kan ikke helt finde ud af hvad der er galt. Jeg tror jeg har dummet mig Arne. Hvis du får tid og lyst må du meget meget gerne kigge forbi denne tråd:

http://www.eksperten.dk/spm/992457

Jeg tror jeg mangler nogle variabler eller noget i mit javascript for at vælge korrekt datoer?

Mvh Mads
Avatar billede arne_v Ekspert
09. marts 2014 - 23:39 #5
Float.parseFloat skal ikke kaldes
Avatar billede madseksperten Nybegynder
09. marts 2014 - 23:45 #6
Ah ja. Når jeg prøver at lave det om, og kalder i min kalender får jeg udskrevet 0.0, selvom jeg vælger et interval hvor timer skulle regnes sammen. Ligesom i denne video:

https://www.youtube.com/watch?v=maXwOJRWf28&feature=youtu.be

her får jeg udskrevet 15.2, men nu får jeg bare 0.0
Avatar billede madseksperten Nybegynder
09. marts 2014 - 23:47 #7
Altså med denne kode får jeg 0.0:

try {

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(connectionURL, "root", "");
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata";
            PreparedStatement pst = connection.prepareStatement(sql);
           
            ResultSet rs = pst.executeQuery(sql);
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    rs.getFloat("Allday_hours");
                   
                } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);   
               
            pst.close();
           
        }
Avatar billede arne_v Ekspert
09. marts 2014 - 23:54 #8
Ikke:

rs.getFloat("Allday_hours");

men:

Allday_hours_sum += rs.getFloat("Allday_hours");
Avatar billede madseksperten Nybegynder
09. marts 2014 - 23:59 #9
Jeg har i min database at jeg har "arbejdet" 9.45 timer d.2014-03-14. Hvis jeg bruger koden her:

Allday_hours_sum += rs.getFloat("Allday_hours");

returner den 35.5 timer. Eller den gør det faktisk uanset hvilken dag jeg vælger :-/ Jeg har en fornemmelse om at jeg ikke vælger og bruger mine start variabler i mit javascript. Altså at javascriptet ikke vælger de specifikke datoer jeg selv vælger
Avatar billede arne_v Ekspert
10. marts 2014 - 00:01 #10
String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata";

har ikke nogen WHERE saa ........................
Avatar billede madseksperten Nybegynder
10. marts 2014 - 00:13 #11
ah ja det er da også rigtigt. Så det vil sige hen ala noget af dette her?

String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE startDate='' AND endDate='' ";
Avatar billede arne_v Ekspert
10. marts 2014 - 00:16 #12
Ja. Med ? i SQL og set af parametre.
Avatar billede madseksperten Nybegynder
10. marts 2014 - 00:18 #13
nej undskyld der er jo ikke noget med startdate og enddate i min MySQL.
Avatar billede madseksperten Nybegynder
10. marts 2014 - 00:28 #14
Jeg er lidt mere med på det nu tror jeg. Det jeg bare ikke er helt med på, er at jeg skal vel bruge startDate og endDate fra mit java script:

$(function(){
        $("#startDate").datepicker({
            dateFormat: 'yy-mm-dd',
            onSelect: function(dateText,inst){
                $('.selected-date').html(dateText);
               
                $.ajax({
                      url: "../getHoursSQL",
                      type: "post",
                      data: JSON,
                      success: function(data){
                          alert("success");
                          $("#startresult").html(data);
                         
                      },
                      error:function(){
                          alert("failure");
                          $("#startresult").html('there is error while submit');
                      } 
                    });
            }
        });
    });

    $(function(){
            $("#endDate").datepicker({
                dateFormat: 'yy-mm-dd',
                onSelect: function(dateText,inst){
                    $('.selected-date').html(dateText);
                 
                    $.ajax({
                          url: "../getHoursSQL",
                          type: "post",
                          data: JSON,
                          success: function(data){
                              alert("success");
                              $("#endresult").html(data);
                          },
                          error:function(){
                              alert("failure");
                              $("#result").html('there is error while submit');
                          } 
                        });
                }
            });
        });

</script>

Men jeg skal vel definere en column fra min database i WHERE?

String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE startDate='?' AND endDate='?' ";
Avatar billede arne_v Ekspert
10. marts 2014 - 03:25 #15
Ja og saa skal startDate og endDate fiskes ud af request.
Avatar billede madseksperten Nybegynder
10. marts 2014 - 09:37 #16
Jeg tænker at der skulle tilføjes noget i mit javascript, før den kan kaldes i min statement, så mit javascript rent faktisk henter den dato jeg vælger? Noget ala :

var currentDate = $( ".selector" ).datepicker( "getDate" );
Avatar billede madseksperten Nybegynder
10. marts 2014 - 11:32 #17
Okay når jeg kører min SQL statement får jeg beskeden :

caught: Unknown column 'startDate' in 'where clause'

String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE startDate='?' AND endDate='?'";

hvilket jo er klart nok da jeg ikke har nogen startDate eller endDate i min database, men i mit javascript. Det vil sige at jeg vel skal have noget ind med den COLUMN der hedder Allday_hours som er en column i min database der indeholder summen. Som du kan se, så når min database står uden jeg kalder noget statement har den de pågældende kolonner:

http://postimg.org/image/5b45xd2xf/

Når mit statement kører bliver Allday_hours oprettet. Det vil sige en slags fiktiv kolonne:

http://postimg.org/image/dedjlkhxb/

Men det har ikke nogen indflydelse vel? Du skrive at jeg skal fiske det ud af request. Det er et request fra mit javascript, eller?
Avatar billede madseksperten Nybegynder
10. marts 2014 - 20:20 #18
Nu ved jeg ikke lige om jeg skal oprette et nyt spørgsmål da dette er lukket, men jeg prøver lige at se om du får beskeden Arne. Jeg har siddet og lavet det idag, og tror jeg er kommet en del tættere på løsningen ? Jeg har prøvet at gøre som du sagde Arne. Jeg får dog en fejl i Console der hedder:

SQLException caught: Parameter index out of range (1 > number of parameters, which is 0).

Det er den nye kode:

java script:

<form>
        <input id="startDate"/>                    
        <input id="endDate"/>
    </form>
    <div id="startresult"></div>
    <div id="endresult"></div>
    <script>
     
    $(function(){
        $("#startDate").datepicker({
            dateFormat: 'yy-mm-dd',
            onSelect: function(dateText,inst){
                $('.selected-date').html(dateText);
               
                $.ajax({
                      url: "../getHoursSQL",
                      type: "post",
                      data: JSON,
                      success: function(data){
                          start: $("#startDate").val();
                          alert("success");
                          $("#startresult").html(data);
                         
                      },
                      error:function(){
                          alert("failure");
                          $("#startresult").html('there is error while submit');
                      } 
                    });
            }
        });
    });

    $(function(){
            $("#endDate").datepicker({
                dateFormat: 'yy-mm-dd',
                onSelect: function(dateText,inst){
                    $('.selected-date').html(dateText);
                 
                    $.ajax({
                          url: "../getHoursSQL",
                          type: "post",
                          data: JSON,
                          success: function(data){
                              end: $("#endDate").val();
                              alert("success");
                              $("#endresult").html(data);
                          },
                          error:function(){
                              alert("failure");
                              $("#result").html('there is error while submit');
                          } 
                        });
                }
            });
        });

</script>

Servlet:

package WorkPackage;

import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet("/getHoursSQL")
public class getHoursSQL extends HttpServlet{

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException{

        String connectionURL = "jdbc:mysql://localhost/NekiWork";
        Connection connection=null;
        String startDate = req.getParameter("startDate");
        String endDate= req.getParameter("endDate");
        try {
            //Load database driver
            Class.forName("com.mysql.jdbc.Driver");
            //Connection to the database
            connection = DriverManager.getConnection(connectionURL, "root", "");
            //Getting the data from database
            String sql = "SELECT *, (Day_hours + (Day_minutes / 60)) AS Allday_hours FROM Workdata WHERE startDate='?' AND endDate='?'";
            PreparedStatement pst = connection.prepareStatement(sql);
                pst.setString(1,startDate);
                pst.setString(2,endDate);
            //Show the result from database
                ResultSet rs = pst.executeQuery(sql);
           
              float Allday_hours_sum = 0;
                while (rs.next()){                                     
                    Allday_hours_sum += rs.getFloat("Allday_hours");
                   
                   
            } 
                res.setContentType("text/html;charset=UTF-8");         
                res.getWriter().print(Allday_hours_sum);
               
               
            pst.close();
           
           
        }
        catch(ClassNotFoundException e){

            System.out.println("Couldn't load database driver: " + e.getMessage());
        }
        catch(SQLException e){
            System.out.println("SQLException caught: " + e.getMessage());
        }
        catch (Exception e){
            System.out.println(e);
        }
        finally {

            try {
                if (connection != null) connection.close();
            }
            catch (SQLException ignored){
                System.out.println(ignored);
            }
        }
    }
}
Avatar billede arne_v Ekspert
10. marts 2014 - 20:31 #19
Der skal ikke '' omkring ?

:-)
Avatar billede madseksperten Nybegynder
10. marts 2014 - 20:38 #20
Hey Arne :-)

Jeg prøvede lige uden og får fejlen:

SQLException caught: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? AND endDate=?' at line 1
Avatar billede arne_v Ekspert
11. marts 2014 - 01:13 #21
ResultSet rs = pst.executeQuery(sql);

skal vaere:

ResultSet rs = pst.executeQuery();

da du allerede har prepared SQL'en.
Avatar billede madseksperten Nybegynder
11. marts 2014 - 12:37 #22
Hejsa Arne.

Tråden er ved at blive rigtig lang og uoverskueligt. Endvidere skal du jo også have point for dit arbehde, selv du har over 1 million :-) Jeg har oprettet en ny tråd med emnet, for lige at anskueligøre problemstillingen lidt dybere end jeg har gjort.

Håber du har tid til at kigge forbi den:
http://www.eksperten.dk/spm/992522

Mvh Mads
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester