자바스크립트를 이용해 데이터를 정렬 시킬려고 하는데.....

moonrepeat의 이미지

음..... 현재 db에 자료가 있습니다.
일단 테이블은 대충 아래와 같습니다.

create table test_level (
  id char(4),
  name varchar(10),
  upper_id char(4),
  constraint fk_test_level foreign key (upper_id) references test_level (id),
  constraint pk_test_level primary key (id)
)

위 테이블에서 제가 의도한 바는 계급의 트리구조를
저장하기위해 만약 최상위 계층이면 id와 upper_id
가 동일하게 만약 하위노드면 자신의 상위노드를 up
per_id를 통해 지시하는 테이블을 의도했습니다.

그리고 대충 jsp를 통해 자료를 빼는것 까지는 문제가
없었는데 이놈을 트리 구조로 나타낼려고 하니 난감하
더군요..... 대충 재귀호출을 쓰면 될것 같지만 자바스크
립트 자체를 써본적이 없는지라. 도대체 어떻게 해야 될
지 모르겠습니다.
(참고로 학교 리포터나, 숙제 절대 아닙니다.)

일단 대충 jsp를 이용해 아래와 같이 자료를 추출했고

var level_db = new Array()
level_db[1] = new dbRecord('0002','0001','부사장')
level_db[2] = new dbRecord('0003','0002','전무')
level_db[3] = new dbRecord('0007','0006','팀장')
level_db[4] = new dbRecord('0001','0001','사장')
level_db[5] = new dbRecord('0004','0003','상무')
level_db[6] = new dbRecord('0005','0004','부장')
level_db[7] = new dbRecord('0006','0005','과장')
level_db[8] = new dbRecord('0008','0007','대리')
level_db[9] = new dbRecord('0009','0008','사원')

이걸 계층형식으로 해야 되는데 조언 부탁드립니다.

마지막으로 구현환경은 windows 2003 + mssql200 + tomcat + iis 입니다....... :oops: :oops:

익명 사용자의 이미지

http://webfx.eae.net/dhtml/xtree/
http://www.softcomplex.com/products/tigra_tree_menu/

이거 말고도 자바 스크립트 사이트 가서 tree 쳐보시면

소스 많이 있구요 요구 형식대로 jsp 를 이용해서 출력 해주면

알아서 트리 생성할겁니다.

전 군대 있을때 (전산병) 위에 타이그라 트리메뉴 이용해서 프로젝트

했었어요. jsp 하고 섞어서요. 조금이나마 도움이 되었길 바랍니다.

moonrepeat의 이미지

답변 주신분 감사합니다.
일단 위의 사이트를 가서 소스를 봤습니다. 그런데 위 소스는 jsp로 정렬을
해서 자바 스크립트로 넘겨 줘야 하더군요.

그래서 다시 질문합니다.
만약 제가 자바에서

String[][] level_data = new String[9][3];

level_data[0][] = ('0002','0001','부사장'); 
level_data[1][] = ('0003','0002','전무'); 
level_data[2][] = ('0007','0006','팀장'); 
level_data[3][] = ('0001','0001','사장'); 
level_data[4][] = ('0004','0003','상무'); 
level_data[5][] = ('0005','0004','부장'); 
level_data[6][] = ('0006','0005','과장'); 
level_data[7][] = ('0008','0007','대리'); 
level_data[8][] = ('0009','0008','사원'); 

이런식으로 배열을 선언했을 경우
아래와 같이 정렬을 시킬려면 어떻게 해야합니까?
level_data[0][] = ('0001','0001','사장'); 
level_data[1][] = ('0002','0001','부사장'); 
level_data[2][] = ('0003','0002','전무'); 
level_data[3][] = ('0004','0003','상무'); 
level_data[4][] = ('0005','0004','부장'); 
level_data[5][] = ('0006','0005','과장'); 
level_data[6][] = ('0007','0006','팀장'); 
level_data[7][] = ('0008','0007','대리'); 
level_data[8][] = ('0009','0008','사원'); 

참고로 level_data[][0] == level_data[][1] 일 경우 최상위
계층으로 인식하고 여러개의 최상위 계층이 존재가 가능하며
최상위 계층이 여러개일 경우 하나의 최상위 계층을 먼저 정렬
시키고 다음걸 정렬 시켜야 합니다.

고수님들의 답변 부탁드립니다.

삽질은 계속되어야 한다....... 쭉.........

dsh의 이미지

table 에서 읽어오실 때 정렬해서 읽으시는게 낫지 않나요?

프로그램에서 어렵게 고민하시는 이유라도 있으신지.

moonrepeat의 이미지

dsh wrote:
table 에서 읽어오실 때 정렬해서 읽으시는게 낫지 않나요?

프로그램에서 어렵게 고민하시는 이유라도 있으신지.

님 제가 쿼리를 잘 못날리겠습니다. 전에도 시도 했다가 시간만 허비하고 말았습니다.
제발 한번만 select문 좀 만들어 주세요 ㅠ.ㅠ

삽질은 계속되어야 한다....... 쭉.........

dsh의 이미지

예시한 내용이야 order by upper_id desc 만 줘도 나오는 결과 같은데요. :?

오라클 사용하시면 sql reference 에서 hierachical query 찾으시면 도움이 되실 거 같네요.

moonrepeat의 이미지

음..... 일단 예시는 간단히 보이게 할려고 그런거고
실제로는 id는 뒤죽 박죽 입니다.
즉 알 수 있는 정보라고는 id와 upper_id가 동일하면 최상위이고
최상위 계체가 아니면 upper_id를 통해서 하나 씩 찾아야 합니다.
ㅠ.ㅠ

삽질은 계속되어야 한다....... 쭉.........

addnull의 이미지

음... 제 생각에는 최상위 노드를 찾은 다음에
각 최상위 노드를 기준으로 트리를 생성 하시고
preorder tree traversal 해서
배열로 전환하셔야 될 것 같습니다.

좀 더 나은 방법이 있을지도 모르겠습니다만
지금으로선 한번에 정렬된 배열을 뽑는 방법이 떠오르지 않는군요.

2005년 7월 14일.

moonrepeat의 이미지

:oops: :oops:

일단 아래와 같이 재귀 호출을 써서 만들어 봤는데 에러가 뜨는군요.....
(제가 할줄 아는게 C언어만 조금 할줄 알지 java나 jsp는 전혀 할 줄 모릅니다.)

<%@ page import="java.sql.*" %>
<%@ page contentType="text/html;charset=euc-kr" %>

<%@ include file = "/connect.jsp" %>

<%!
	String lineup_data(String[][] s,String z, int m){
		String s2 = null;
		int i = 0;

		for(i=0;i<m;i++){
			if(s[i][1].equals(z)){
				s2 = s[i][0] + "," + s[i][1] + "," + s[i][2] + "<br>";
				s2 = s2 + lineup_data(s,s[i][0],m);
			}
		}

		return s2;
	}
%>
<%
	String data_copy = null;
	int max_count = 0;
	int i = 0;

	String SQL = null;
	ResultSet RS = null;

	SQL="select count(d_l_no) from level where d_l_no != '0000' and d_l_no != '9999' and d_l_no != d_l_upper";
	RS=stmt.executeQuery(SQL);

	RS.next();

	max_count = RS.getInt(1);

	String[][] level_data = new String[max_count][3];

	SQL="select d_l_no,d_l_upper,d_l_name from level where d_l_no != '0000' and d_l_no != '9999'";
	RS=stmt.executeQuery(SQL);

	while(RS.next()){
		level_data[i][0] = RS.getString(1);
		level_data[i][1] = RS.getString(2);
		level_data[i][2] = RS.getString(3);
		i = i + 1;
	}

	SQL="select d_l_no,d_l_upper,d_l_name from level where d_l_no != '0000' and d_l_no != '9999' and d_l_no = d_l_upper";
	RS=stmt.executeQuery(SQL);

	while(RS.next()){
		data_copy = null;
		data_copy = RS.getString(1) + "," + RS.getString(2) + "," + RS.getString(3) + "<br>";
		data_copy = data_copy + lineup_data(level_data,RS.getString(1),max_count);
		out.println(data_copy);
	}

	stmt.close();
	conn.close();
%>

재귀 호출시 걍 몽땅그리 배열을 넘기게 되어 있는데 이래도 되는지 모르겠고
(뭐 여하간 작동이 안되니.....)
대충 미치 겠습니다.......

고수님들 소스보시고 잘못 되곳좀 지적해주세요

참고로 아래는 위 소스에 사용된 쿼리문 결과입니다.

select count(d_l_no) from level where d_l_no != '0000' and d_l_no != '9999' and d_l_no != d_l_upper

열이름 없음
16

select d_l_no,d_l_upper,d_l_name from level where d_l_no != '0000' and d_l_no != '9999'

d_l_no	d_l_upper	d_l_name     
d_l_no	d_l_upper	d_l_name
0001	0001		사장
0002	0001		부사장
0003	0002		전무
0004	0003		상무
0005	0004		부장
0006	0005		과장
0007	0006		팀장
0008	0007		대리
0009	0008		사원
0022	0001		부사장1
0033	0002		전무2
0044	0003		상무2
0055	0004		부장2
0066	0005		과장2
0077	0006		팀장2
0088	0007		대리2
0099	0008		사원2

select d_l_no,d_l_upper,d_l_name from level where d_l_no != '0000' and d_l_no != '9999' and d_l_no = d_l_upper

d_l_no	d_l_upper	d_l_name
0001	0001		사장

그리고 에러 화면입니다.

HTTP Status 500 - 

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

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

org.apache.jasper.JasperException: 16
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:372)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


root cause 

java.lang.ArrayIndexOutOfBoundsException: 16
	org.apache.jsp.etc.test3_jsp._jspService(test3_jsp.java:106)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)


note The full stack trace of the root cause is available in the Apache Tomcat/5.0.28 logs.

삽질은 계속되어야 한다....... 쭉.........

addnull의 이미지

저도 JSP 나 Java는 전혀 모릅니다 :(
다만 소스 코드를 보니 약간 이상한 점이 있군요.

lineup_data 함수에서
s2 = s[i][0] + "," + s[i][1] + "," + s[i][2] + "<br>";
이게 아니라.
s2 += (s[i][0] + "," + s[i][1] + "," + s[i][2] + "<br>");
이렇게 되야할 듯 싶습니다.

max_count 구하기 위한 첫번째 SQL 쿼리문에서는 d_l_no != d_l_upper 하셨으니,
두번째 SQL 쿼리문 적으실때도
SQL="select d_l_no,d_l_upper,d_l_name from level where d_l_no != '0000' and d_l_no != '9999'";
가 아니라
SQL="select d_l_no,d_l_upper,d_l_name from level where d_l_no != '0000' and d_l_no != '9999'" and d_l_no != d_l_upper;
라 생각됩니다.

아마 error code 500 에 full stack 어쩌구 그런거 보니
재귀호출에서 배열을 몽땅 넘긴게 문제가 있지 않은가.. 추측됩니다 ???

atie의 이미지

ArrayIndexOutOfBoundsException이니, [][]에 넘겨지는 변수값을 println해보면 알텐데요.
JSP라도 가급적이면 .java로 먼저 코드를 작성해 보고 테스트가 된 후에 jsp에 붙여 넣는 것이 좋습니다.

----
I paint objects as I think them, not as I see them.
atie's minipage

moonrepeat의 이미지

일단 어니스트 님의 조언 덕분에 대충 해결했습니다.
그런데 제가 jsp가 처음이라 atie님 말대로 (이 걸 의도 하신지 확실치 않지만)
함수에서 out.println 으로 하나 씩 출력하게 했는데 함수내에서 out.println
을 넣으니 에러가 뜨더군요........

여하간 스택에 무리는 가겠지만 해결하긴 했습니다.

삽질은 계속되어야 한다....... 쭉.........

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.