2024년 6월 28일 금요일

ORACLE DB - CREATE

 

/***********************************************
  Oracle DB 테이블 생성
   Oracle 19c 기준으로 작성되었습니다. 
***********************************************/


/***********************************************
 CUST(고객) 테이블 생성
 STR 계정 접속
***********************************************/
CREATE TABLE STR.CUST
(
	CUST_NO   VARCHAR2(20)    NOT NULL,
	CUST_NM   VARCHAR2(1000)  NOT NULL,
	JOIN_DY   VARCHAR2(8)     NULL,
	PASSWD    VARCHAR2(100)   NOT NULL,
	BRTH_DD   VARCHAR2(8)     NULL
)
TABLESPACE TS_STR_D;


CREATE UNIQUE INDEX STR.CUST_PK ON STR.CUST
(CUST_NO)
TABLESPACE TS_STR_I;


ALTER TABLE STR.CUST
ADD CONSTRAINT CUST_PK 
PRIMARY KEY(CUST_NO);


COMMENT ON TABLE  STR.CUST IS '고객';

COMMENT ON COLUMN STR.CUST.CUST_NO IS '고객번호';
COMMENT ON COLUMN STR.CUST.CUST_NM IS '고객명';
COMMENT ON COLUMN STR.CUST.JOIN_DY IS '가입일자';
COMMENT ON COLUMN STR.CUST.PASSWD IS '비밀번호';
COMMENT ON COLUMN STR.CUST.BRTH_DD IS '생년월일';


/***********************************************
 CUST_DTL(고객상세) 테이블 생성
 STR 계정 접속
***********************************************/

CREATE TABLE STR.CUST_DTL
(
	CUST_NO       VARCHAR2(20)   NOT NULL,
	MBL_NO        VARCHAR2(13)   NULL,
	HOME_ADDR     VARCHAR2(1000) NULL,
	ZIP_CD        VARCHAR2(10)   NULL,
	EMAIL         VARCHAR2(200)  NULL
)
TABLESPACE TS_STR_D;


CREATE UNIQUE INDEX STR.CUST_DTL_PK ON STR.CUST_DTL
(CUST_NO)
TABLESPACE TS_STR_I;

ALTER TABLE STR.CUST_DTL
ADD CONSTRAINT CUST_DTL_PK 
PRIMARY KEY(CUST_NO);


COMMENT ON TABLE  STR.CUST_DTL    IS '고객상세';

COMMENT ON COLUMN STR.CUST_DTL.CUST_NO IS '고객번호';
COMMENT ON COLUMN STR.CUST_DTL.MBL_NO IS '휴대폰번호';
COMMENT ON COLUMN STR.CUST_DTL.HOME_ADDR IS '집주소';
COMMENT ON COLUMN STR.CUST_DTL.ZIP_CD IS '우편번호';
COMMENT ON COLUMN STR.CUST_DTL.EMAIL IS '이메일';



/***********************************************
 테이블, 인덱스 상태 확인
 STR 계정 접속
***********************************************/
SELECT
    OBJECT_TYPE,
    OBJECT_NAME,
    CREATED
FROM USER_OBJECTS
ORDER BY 2,1;


/***********************************************
 테이블 상태 확인
 STR 계정 접속
***********************************************/

SELECT 
    A.TABLE_NAME, 
    B.COMMENTS AS "TABLE_COMMENT",
    A.COLUMN_NAME, 
    C.COMMENTS AS "COLUMN_COMMENT",
    A.COLUMN_ID 
FROM 
    USER_TAB_COLUMNS A,
    USER_TAB_COMMENTS B,
    USER_COL_COMMENTS C
WHERE A.TABLE_NAME = B.TABLE_NAME
AND A.TABLE_NAME = C.TABLE_NAME
AND A.COLUMN_NAME = C.COLUMN_NAME
ORDER BY A.TABLE_NAME, A.COLUMN_ID;




/***********************************************
 CUST(고객) 데이터 입력
 STR 계정 접속
***********************************************/
-- CUST(고객) 테이블 데이터 50건 입력
-- 데이터 특이사항 (김영일 3명, 김영칠 3명)

INSERT INTO STR.CUST VALUES('20221125JPYM00000001','김영일','20040101','flne5450','20000701');
INSERT INTO STR.CUST VALUES('20221125DROE00000002','김영이','20040101','npek0233','20000702');
INSERT INTO STR.CUST VALUES('20221125KJQN00000003','김영삼','20040305','zxet2771','20000703');
INSERT INTO STR.CUST VALUES('20221125WEGD00000004','김영사','20040305','tgli5670','20000704');
INSERT INTO STR.CUST VALUES('20221125AJKK00000005','김영오','20040405','iayw6265','20020705');
INSERT INTO STR.CUST VALUES('20221125LADR00000006','김영육','20040407','ohew6324','20020706');
INSERT INTO STR.CUST VALUES('20221125TKDN00000007','김영칠','20040507','jdsf1139','20020707');
INSERT INTO STR.CUST VALUES('20221125FGJP00000008','김영팔','20050207','pqmj2289','20020708');
INSERT INTO STR.CUST VALUES('20221125ZERM00000009','김영구','20050207','sgie6302','20020709');
INSERT INTO STR.CUST VALUES('20221125IOUS00000010','김일영','20050207','kyqd0483','20020710');
INSERT INTO STR.CUST VALUES('20221125FREG00000011','김일일','20051119','ljix4309','20020711');
INSERT INTO STR.CUST VALUES('20221125JXYA00000012','김일이','20060119','vzvi3915','20050712');
INSERT INTO STR.CUST VALUES('20221125ANQL00000013','김일삼','20060119','dzid2179','19620713');
INSERT INTO STR.CUST VALUES('20221125IKVD00000014','김일사','20060119','cmuf6339','19620714');
INSERT INTO STR.CUST VALUES('20221125ABAI00000015','김일오','20060119','zysq7590','19620715');
INSERT INTO STR.CUST VALUES('20221125YXTK00000016','김일육','20060119','ykwm7623','19620716');
INSERT INTO STR.CUST VALUES('20221125OHAF00000017','김일칠','20060225','qsne5403','19550717');
INSERT INTO STR.CUST VALUES('20221125SAVG00000018','김일팔','20060225','vzsa4413','19550718');
INSERT INTO STR.CUST VALUES('20221125APRV00000019','김일구','20090225','zums3447','19550719');
INSERT INTO STR.CUST VALUES('20221125XCRU00000020','김일영','20090225','xjvz8461','19550720');
INSERT INTO STR.CUST VALUES('20221125XUZN00000021','김이일','20090508','axov6969','20010801');
INSERT INTO STR.CUST VALUES('20221125RFSZ00000022','김이가','20090508','fitu9267','20010802');
INSERT INTO STR.CUST VALUES('20221125GSUH00000023','김이삼','20090508','pqnw5647','20010803');
INSERT INTO STR.CUST VALUES('20221125MNCU00000024','김이사','20090508','rviv2232','20010804');
INSERT INTO STR.CUST VALUES('20221125ZFMC00000025','김이오','20100217','omor3320','19910805');
INSERT INTO STR.CUST VALUES('20221125XUGB00000026','김이육','20100217','iwcm7473','19910806');
INSERT INTO STR.CUST VALUES('20221125CIGG00000027','김이칠','20100217','ultb6084','19910807');
INSERT INTO STR.CUST VALUES('20221125NNXY00000028','김이팔','20100217','ixwx3137','19910808');
INSERT INTO STR.CUST VALUES('20221125VZWP00000029','김이구','20100217','tpin3069','19830809');
INSERT INTO STR.CUST VALUES('20221125CLJU00000030','김삼영','20100217','olha1635','19830810');
INSERT INTO STR.CUST VALUES('20221125AVME00000031','김삼일','20120602','dyho5331','19880811');
INSERT INTO STR.CUST VALUES('20221125NYAA00000032','김영칠','20120602','jfly1680','19980812');
INSERT INTO STR.CUST VALUES('20221125UDXV00000033','김삼삼','20120602','ydeo9942','19980813');
INSERT INTO STR.CUST VALUES('20221125WYVA00000034','김삼사','20120602','fylt4787','19980814');
INSERT INTO STR.CUST VALUES('20221125CFTF00000035','김삼오','20120602','aoyd7537','19670815');
INSERT INTO STR.CUST VALUES('20221125SQXC00000036','김삼육','20120602','waaz3678','19670816');
INSERT INTO STR.CUST VALUES('20221125SQWO00000037','김삼칠','20220102','maat3026','19670817');
INSERT INTO STR.CUST VALUES('20221125ZMPZ00000038','김영일','20220102','iuzn5413','19670818');
INSERT INTO STR.CUST VALUES('20221125AYGK00000039','김삼구','20220102','mwzc8562','19670819');
INSERT INTO STR.CUST VALUES('20221125THBX00000040','김사영','20220102','tvgz0417','19750820');
INSERT INTO STR.CUST VALUES('20221125MDBK00000041','김사일','20220115','alvz3064','19750901');
INSERT INTO STR.CUST VALUES('20221125LTYY00000042','김사가','20220115','xuhp4988','19750902');
INSERT INTO STR.CUST VALUES('20221125FPUV00000043','김사삼','20220115','ssly9245','19750903');
INSERT INTO STR.CUST VALUES('20221125CHXS00000044','김사사','20220415','glzn5012','19750904');
INSERT INTO STR.CUST VALUES('20221125MJTM00000045','김사오','20220415','tlht5713','19700905');
INSERT INTO STR.CUST VALUES('20221125LQZU00000046','김사육','20220415','whtk7257','19700906');
INSERT INTO STR.CUST VALUES('20221125CEGQ00000047','김사칠','20220808','xamu3455','19960907');
INSERT INTO STR.CUST VALUES('20221125FWXP00000048','김사팔','20220808','uxub8838','19960908');
INSERT INTO STR.CUST VALUES('20221125JVPE00000049','김영칠','20220808','vnry4863','19960909');
INSERT INTO STR.CUST VALUES('20221125JWBX00000050','김영일','20220808','kdlb3873','19960910');

COMMIT;


/***********************************************
 CUST_DTL(고객상세) 데이터 입력
  STR 계정 접속
***********************************************/
-- CUST_DTL(고객상세) 테이블 데이터 50건 입력
-- 데이터 특이사항 NULL값 4건, Empty String값 4건

INSERT INTO STR.CUST_DTL VALUES('20221125JPYM00000001','015-0101-0101','서울시 강남구 압구정동','06000','uljbou@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125DROE00000002','015-0101-0102','서울시 강남구 압구정동','06000','oldbic@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125KJQN00000003','015-0101-0103','서울시 강남구 압구정동','06000','wbojex@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125WEGD00000004','015-0101-0104','서울시 강남구 압구정동','06000','yhilhj@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125AJKK00000005','015-0101-0105','서울시 강남구 압구정동','06000','tasorz@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125LADR00000006','015-0101-0106','서울시 강남구 청담동','06074','wizgkj@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125TKDN00000007','015-0101-0107','서울시 강남구 청담동','06074','zvrexd@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125FGJP00000008','015-0101-0108','서울시 강남구 청담동','06074','ribait@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125ZERM00000009','015-0101-0109','서울시 강남구 청담동','06074','zuhzaq@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125IOUS00000010','015-0101-0110','서울시 강남구 청담동','06074','gnlcqg@superemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125FREG00000011','015-0101-0111','서울시 강남구 도곡동','06294','tcoesv@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125JXYA00000012','015-0101-0112','서울시 강남구 도곡동','06294','gwuujt@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125ANQL00000013','015-0101-0113','서울시 강남구 도곡동','06294','mzsgxy@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125IKVD00000014','015-0101-0114','서울시 강남구 도곡동','06294','evmcrl@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125ABAI00000015','015-0101-0115','서울시 강남구 도곡동','06294','fnbvau@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125YXTK00000016','015-0101-0116','서울시 강남구 신사동','06027','vqfsez@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125OHAF00000017','015-0101-0117','서울시 강남구 신사동','06027','scwfrs@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125SAVG00000018','015-0101-0118','서울시 강남구 신사동','06027','fsjzna@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125APRV00000019','015-0101-0119','서울시 강남구 신사동','06027','dcearf@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125XCRU00000020','015-0101-0120','서울시 강남구 신사동','06027','czpqas@metajjemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125XUZN00000021','015-0101-0121','서울시 서초구 반포동','06547','pcnann@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125RFSZ00000022','015-0101-0122','서울시 서초구 반포동','06547','sebplp@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125GSUH00000023','015-0101-0123','서울시 서초구 반포동','06547','rknvcf@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125MNCU00000024','015-0101-0124','서울시 서초구 반포동','06547','miqfws@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125ZFMC00000025','015-0101-0125','서울시 서초구 반포동','06547','zxpvie@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125XUGB00000026','015-0101-0126','서울시 강남구 대치동','06284','shfjff@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125CIGG00000027','015-0101-0127','서울시 강남구 대치동','06284','gyxloz@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125NNXY00000028','015-0101-0128','서울시 강남구 대치동','06284','qunrwt@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125VZWP00000029','015-0101-0129','서울시 강남구 대치동','06284','koigww@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125CLJU00000030','015-0101-0130','서울시 강남구 대치동','06284','koacww@gonnemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125AVME00000031','015-0101-0131','부산광역시 해운대구 중동','48099','rkmhzr@narademail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125NYAA00000032','015-0101-0132','부산광역시 해운대구 중동','48099','vxikgq@narademail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125UDXV00000033','015-0101-0133','부산광역시 해운대구 중동','48099','ecddxs@narademail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125WYVA00000034','015-0101-0134','부산광역시 해운대구 중동','48099','mjmxcf@narademail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125CFTF00000035','015-0101-0135','부산광역시 해운대구 중동','48099','bdwfmb@narademail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125SQXC00000036','015-0101-0136','부산광역시 해운대구 우동','48092','byjkso@narademail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125SQWO00000037','015-0101-0137','부산광역시 해운대구 우동','48092',' ');
INSERT INTO STR.CUST_DTL VALUES('20221125ZMPZ00000038','015-0101-0138','부산광역시 해운대구 우동','48092',' ');
INSERT INTO STR.CUST_DTL VALUES('20221125AYGK00000039','015-0101-0139','부산광역시 해운대구 우동','48092','');
INSERT INTO STR.CUST_DTL VALUES('20221125THBX00000040','015-0101-0140','부산광역시 해운대구 우동','48092','');
INSERT INTO STR.CUST_DTL VALUES('20221125MDBK00000041','015-0101-0141','부산광역시 부산진구 부전동','47300','twvruy@qoodaemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125LTYY00000042','015-0101-0142','부산광역시 부산진구 부전동','47300','fvovzz@qoodaemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125FPUV00000043','015-0101-0143','','47300','vwyein@qoodaemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125CHXS00000044','015-0101-0144','','47300','yqavsm@qoodaemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125MJTM00000045','015-0101-0145','부산광역시 부산진구 부전동','47300','adrwte@qoodaemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125LQZU00000046','015-0101-0146',' ','48230','zkionw@qoodaemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125CEGQ00000047','015-0101-0147',' ','48230','cpkghk@qoodaemail.com');
INSERT INTO STR.CUST_DTL VALUES('20221125FWXP00000048','015-0101-0148','부산광역시 수영구 수영동','48230','메일주소');
INSERT INTO STR.CUST_DTL VALUES('20221125JVPE00000049','999-9999-9999','몰라','48230','난아싸라@이메일이없어요');
INSERT INTO STR.CUST_DTL VALUES('20221125JWBX00000050','000-0000-0000','님 마음속','48230','이메일');

COMMIT;




/***********************************************
 데이터 입력 에러 해결 방법(ORA-01950)
 SYS 계정 접속
***********************************************/

-- ORA-01950: 테이블스페이스 'TS_STR_D'에 대한 권한이 없습니다.

-- TS_STR_D 테이블스페이스 권한 생성
GRANT UNLIMITED TABLESPACE TO STR;

-- 권한 확인
SELECT * 
FROM DBA_SYS_PRIVS 
WHERE GRANTEE='STR';


-- TS_STR_D 테이블스페이스 권한 원복 
REVOKE UNLIMITED TABLESPACE FROM STR;

-- 권한 확인
SELECT * 
FROM DBA_SYS_PRIVS 
WHERE GRANTEE='STR';


/***********************************************
 SQL 실행
 STR 계정 접속
***********************************************/

SELECT
    A.CUST_NO,
    A.CUST_NM,
    A.BRTH_DD,
    B.MBL_NO,
    B.HOME_ADDR,
    B.EMAIL
FROM 
    STR.CUST A,
    STR.CUST_DTL B
WHERE A.CUST_NO = B.CUST_NO
AND A.CUST_NM = '김영구';
--AND A.CUST_NM IN ('김영구','김이오','김일구');



/***********************************************
 CUST(고객), CUST_DTL(고객상세) 데이터 삭제
 STR 계정 접속
***********************************************/

TRUNCATE TABLE STR.CUST;
TRUNCATE TABLE STR.CUST_DTL;


/***********************************************
 CUST(고객), CUST_DTL(고객상세) 테이블 삭제
 STR 계정 접속
***********************************************/

DROP TABLE STR.CUST;
DROP TABLE STR.CUST_DTL;

[출처] DB보다


2024년 6월 27일 목요일

javascript - 기본 및 활용

 
// ready
$(document).ready(function () {
// 버튼 클릭 이벤트
$("#btnID").click(function () {
});
// layer 클릭 이벤트
$(".layer").find("a[class='close_layer_popup']").click(함수호출);
// keypress 이벤트
$("#textID").keypress(inputOnlyNumber);
$("input[id^=txtPhoneNum]:text, input[id^=txtCellNum]:text").keypress(inputOnlyNumber);
// focusout 이벤트
$("#textID").focusout(function(e) {
});
// attr 속성 값 가지고 오기
var data_abc = parseInt($("#textID").attr("data-abc"));
});
// load
$(window).load(function () {
});

// 숫자키만 입력 + 특수문자 일부 허용
function inputOnlyNumber() {
    if (event.keyCode >= 44 && event.keyCode <= 57) {
        return true;
    } else {
        return false;
    }
}

// 간단한 ajax 사용 예문
$.ajax({
url: "url.asp",
type: "POST",
data: "IDX=" + idx + "&GUBUN=" + gubun,
contentType: "application/x-www-form-urlencoded; charset=euc-kr", // 한글 문제인 경우
async: false, // 동기화 처리
success: function (data) {
//alert(data == "SUCCESS" ? "성공" : "실패");
},
error: function (request, status, error) {
//alert("code:" + request.status + "\n" + "message:" + request.responseText + "\n" + "error:" + error);
}
});
// ajax (json)
$.ajax({
url: "/aaa/bbb.asp",
async: false,
type: "POST",
contentType: "application/json",
data: "{Num:'" + Num + "', vId:'" + vId + "', zipCode:'" + zipCode + "' , isfree:'" + 1 + "'}",
success: function (result) {
var aaa = result[0].AAA;
},
error: function() {
alert("장바구니 정보 수정에 실패하였습니다.");
}
});


// 체크박스 전체 선택 및 미선택
function CheckBox_All(obj, cbName) {
$("input:checkbox[name=" + cbName + "]").each(function () {
$(this).prop("checked", $(obj).is(":checked"));
});
}
 
// 체크되어 있는 체크박스 개수 확인
var checkLength = $("input:checkbox[name=" + cbName + "]:checked").length;
if (checkLength == 0) {
alert("일괄 수정할 선택한 상품이 없습니다.");
return false;
}

// 체크되어 있는 체크박스 찾아서 박복 처리
var checkRequestPrice = true;
var checkPrePrice = true;
$("input:checkbox[name=" + cbName + "]:checked").each(function () {
// table의 tr 중에 체크박스와 같은 tr을 찾아 tr 안에 있는 hidden 또는 text 값 구하기
var prePrice = $(this).closest('tr').find("input:hidden[name=prePrice]").val();
var requestPrice = ($(this).closest('tr').find("input:text[name=requestPrice]").val()).replace(",", "");
// 숫자 체크
if ($.isNumeric(requestPrice) == false || requestPrice == "0") {
checkRequestPrice = false;
}
// 문자를 숫자로 비교
if (parseInt(prePrice) == parseInt(requestPrice)) {
checkPrePrice = false;
}
// 해당 tr 삭제
$(this).closest("tr").remove();
});

// 부모창 > 부모창 > 자식창에서 부모창 호출 방법
// 자식창
parent.WindowCloseAndRefresh();
// 부모창
function WindowCloseAndRefresh() {
parent.opener.location.reload();
window.close();
}

// iframe으로 데이터 submit하여 처리하는 방법 (formAction form에 있는 객체 데이터)
<div style="display: none;">
    <iframe name="ifrmAction" id="ifrmAction" height="0" width="0"></iframe>
</div>
formAction.action = "Exec.asp";
formAction.target = "ifrmAction";
formAction.submit();

// 객체 활성화 및 비활설화
$("#COUNT_EVERY").prop('disabled', true);
$("input").prop('disabled', false);

// table > tr > td 에 있는 html 값 가지고 오기
function ProdAdd() {
var items = $("input:checkbox[name=chkBoxName]:checked");
if (items.length == 0) {
alert("선택해 주세요.");
return false;
}
var a = "";
var b = "";
var c = "";
$(items).each(function () {
var tdObj = $(this).closest("tr").find('td');
a = $(this).val();
b = $(tdObj).eq(2).html();
c = $(tdObj).eq(3).html();
if (parent.IsFindProd(ProdNum) == false) {
parent.SeachProdSelectAdd(a, b, c);
}
});
}

// 반복 값 join 만들기
var arrays = $("input[name=chkboxName]:checkbox:checked").map(function () {
return "'" + $(this).attr("data-abc") + "'";
}).get();
var arrayJoin = "[" + arrays.join(",") + "]";


// 요소 추가
function SeachProdSelectAdd(a, b, c) {
var appendHtml = "<tr style='height: 22px;' onmouseover='this.style.backgroundColor=\"#E3FEEB\"' onmouseout='this.style.backgroundColor=\"#FFFFFF\"'><td style='text-align: center;'><input type='checkbox' name='chkBoxPRODADD' value='" + a + "' style='cursor: pointer;' /><input type='hidden' name='PROD_ADD' value='" + a + "'></td><td style='text-align: center;'>" + a + "</td><td>" + b + "</td><td>" + c + "</td></tr>"
//$("#tablePRODADD").append(appendHtml);  // 자식(children) 뒤 요소에 추가
$("#tablePRODADD").prepend(appendHtml);   // 자식(children) 앞 요소에 추가
}

// 텍스트 박스 엔터키 클리 시 submit 처리
<input type="text" name="s_word1" size="25" value="<%=strSWord1%>" onkeypress="FN_FormSubmit()">
function FN_FormSubmit() {
if (event.keyCode == 13) {
document.ListForm.submit();
}
}

// for 문
for (var i = 0; i < list.length; i++) {
}
// 공백제거
$.trim("문자")



C# - 기본 및 활용

 
//-----------------------------------------------
        [AllowAnonymous]
        public ActionResult 함수_페이지(string reftype = null)
        {
            return View(new Tuple<클래스타입1, 클래스타입2[], 클래스타입3[], 클래스타입4[]>(객체1, 객체2, 객체3, 객체4));
        }
        @using Model.Common
        @model Tuple<클래스타입1, 클래스타입2[], 클래스타입3[], 클래스타입4[]>


//-----------------------------------------------
        [AllowAnonymous, ChildActionOnly]
        public PartialViewResult 함수_Partial()
        {
            return PartialView(new Tuple<Banner>(adBanner));
        }
        @using Model.Common
        @model Tuple<Banner>

        @Html.Action("함수_Partial", "Main")

//-----------------------------------------------
        [HttpPost]
        public JsonResult 함수_기능(int Idx)
        {
            //return Json(new {객체1, 객체2});
            return Json(객체);
        }

//-----------------------------------------------
        [NonAction]
        private object 함수_기능()
        {
            return list.Select(x => new
            {
                PROD_NUM = x.PROD_NUM,
                IDX = x.IDX
            });
        }


//-----------------------------------------------
[FilterConfig.cs]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class UserAuthorizationAttribute : FilterAttribute, IAuthorizationFilter
    {
        public RoleType Role { get; set; }
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if ((Role & RoleType.Wos) == RoleType.Wos)
            {
                if (!객체.IsWos) // Wos가 아니면
                {
                    throw new Exception("Wos 권한이 없습니다.");
                }
            }
        }
    }

    [Flags]
    public enum RoleType
    {
        Wos
    }


[View1.cs]
        [UserAuthorization(Role = RoleType.Wos)]
        public ActionResult WosCart(string cList)
        {
            ViewBag.Name = Common.객체1.Name;
            return View(Json(cList));
        }



//-----------------------------------------------
        private Dictionary<string, string> GetParameterResultMap(string parameter)
        {
            // + 기호가 공백으로 넘어 오는경우 처리
            string decString = parameter.Replace(" ","+");
            Dictionary<string, string> resultMap = parseStringToMap(decString);
            return resultMap;
        }

        public static System.Collections.Generic.Dictionary<string, string> parseStringToMap(string text)
        {
            System.Collections.Generic.Dictionary<string, string> retMap = new System.Collections.Generic.Dictionary<string, string>();
            if (string.IsNullOrEmpty(text) || string.IsNullOrWhiteSpace(text))
                return retMap;
            string[] arText = text.Split('&');
            for (int i = 0; i < arText.Length; i++)
            {
                string[] arKeyVal = arText[i].Split('=');
                retMap.Add(arKeyVal[0], arKeyVal[1]);
            }
            return retMap;
        }




//-----------------------------------------------
    public enum CancelState : int
    {
        [Description("취소요청")]
        RequestCancel = 0,
        [Description("취소대기")]
        ProcessingCancel = 1,
        [Description("취소불가")]
        ImpossibleCancel = 2,
        [Description("취소완료")]
        CompleteCancel = 3
    }




//-----------------------------------------------
    public class InicisRequest
    {
        #region 기본 데이터 필드
        [Required]
        [StringLength(20)]
        public string version { get; set; }
        [Required]
        [StringLength(10)]
        public string mid { get; set; }
        [Required]
        public int price { get; set; }
        public int tax { get; set; }
        #endregion
    }



ASP - DATE

 
'====================================
Description : 주의시작은 일요일이라 가정한다
'====================================
 '-- 해당날짜에 해당하는 날짜의 일요일과 토요일날짜 구해옴( 형식 chkdate : 2009-01-01)
 FUNCTION week_day(chkdate)
  SELECT CASE weekday(CDate(chkdate))
   CASE 1 : temp1 = CDate(chkdate) - 0 : temp2 = CDate(chkdate) + 6 '일
   CASE 2 : temp1 = CDate(chkdate) - 1 : temp2 = CDate(chkdate) + 5 '월
   CASE 3 : temp1 = CDate(chkdate) - 2 : temp2 = CDate(chkdate) + 4 '화
   CASE 4 : temp1 = CDate(chkdate) - 3 : temp2 = CDate(chkdate) + 3 '수
   CASE 5 : temp1 = CDate(chkdate) - 4 : temp2 = CDate(chkdate) + 2 '목
   CASE 6 : temp1 = CDate(chkdate) - 5 : temp2 = CDate(chkdate) + 1 '금
   CASE 7 : temp1 = CDate(chkdate) - 6 : temp2 = CDate(chkdate) + 0 '토
  END SELECT
  week_day = temp1 &"|"& temp2
 END FUNCTION

'-- 현재일의 주차
FUNCTION now_week(getdate)
  now_week = int((Day(getdate) - weekday(getdate)+13)/7)
 END FUNCTION

 '-- 해당달의 마지막일
 FUNCTION last_day(year,month)
  temp = CDate(LEFT(dateadd("m",1,year &"-"& month &"-01"),7) &"-01")-1
  last_day = Split(temp,"-")(2)
 END FUNCTION
 
 '-- 현재월의 주차( 형식 getdate : 2009-01-01)
 FUNCTION now_week(getdate)
  now_week = int((Day(getdate) - weekday(getdate)+13)/7)
 END FUNCTION
 
 '-- 해당년의 전달까지의 주차수
 FUNCTION month_week(year, month)
  week = 0
  FOR i = 1 TO month - 1
   week = week + now_week(year &"-"& i &"-"& last_day(year,i))
  NEXT
  month_week = week
 END FUNCTION
 
 '-- 해당년의 주차수의 일요일(안됨;;)
 FUNCTION week_sunday(year,week)
  week_sunday = CDate(year &"-01-01")+(week-1)*7+1-WEEKDAY(CDate(year& "-01-01")+(week-1)*7)
 END FUNCTION

 '-- 해당년의 주차수의 일요일(형식 now_month_week("2009","02","2") : 2009년2월2주차)
FUNCTION now_month_week(year,month,week_cnt)
  a = CDate(year &"-01-01") '-- 시작기준일
  b = Datepart("ww",year &"-"& month &"-01",1,3) '-- 해당월의 시작일의 주차
  c = 7 * b '--7에 주차를 곱하면 몇일 뒤 인지 나옴
  d = DateAdd("d",c,a) '--시작기준일에서 날짜를 c 만큼 더해준다
  '-- 해당월의 시작일이 일요일이면 첫주이므로 원하는주차에서 7을 빼준다.
  IF weekday(year &"-"& month &"-01") = 1 THEN
   d = CDate(d) + (7 * week_cnt) - 7
  ELSE
   d = CDate(d) + (7 * week_cnt)
  END IF
  now_month_week = d
 END FUNCTION

function num_Week(arg_num)
    Select Case arg_num
        Case 1
            we = "일요일"
        Case 2
            we = "월요일"
        Case 3
            we = "화요일"
        Case 4
            we = "수요일"
        Case 5
            we = "목요일"
        Case 5
            we = "금요일"
        Case 7
            we = "토요일"
    End Select
    num_Week = we
end function

function Now_Week() "오늘의 요일
    MyWeekDay = Weekday (Now())
    Now_Week = num_Week(MyWeekDay)
end function

function first_Week() "이번달 1일의 요일
    MyWeekDay = Weekday(DateAdd("d",1-day(now()), now()) )
    first_Week = num_Week(MyWeekDay)
end function

function Count_Week() "오늘이 몇주차?
        "2째주 일요일 찾기
        se_sun = 9 - Weekday(DateAdd("d", 1-day(now()), now()))
        "2째주 일요일보다 작은 경우 오늘은1주차
        if cint(se_sun) > cint(day(now())) then
                Count_Week = 1
        else "2주이상
                "남은 날짜 계산
                mod_day = cint(day(now()) - se_sun + 1)
                " 남은 날짜를 7로 나눈 나머지가 0이면 몫을사용 아니면 몫+1 한다.
                if (mod_day mod 7) = 0 then
                        Count_Week = (mod_day / 7) + 1 "1주차를 더한다
                else
                        Count_Week = int(mod_day / 7) + 2 "1주차와 마지막주를 더한다 합이 2주
                end if
        end if
end function

2024년 2월 21일 수요일

javascript - SQL 예약어 제거

 
<script language="javascript">

//특수문자, 특정문자열(sql예약어) 제거
function checkSearchedWord(obj){
obj.value = obj.value+" ";
//특수문자 제거
if(obj.value.length >0){
var expText = /[%=><]/ ;
if(expText.test(obj.value) == true){
obj.value = obj.value.split(expText).join(""); 
}
//체크 문자열
var sqlArray = new Array( //sql 예약어
"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC", "UNION",  "FETCH", "DECLARE", "TRUNCATE"
);
var regex;
var regex_plus ;
for(var i=0; i<sqlArray.length; i++){
regex = new RegExp("\\s" + sqlArray[i] + "\\s","gi") ;
if (regex.test(obj.value)) {
obj.value =obj.value.replace(regex, "");
alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
}
regex_plus = new RegExp( "\\+" + sqlArray[i] + "\\+","gi") ;
if (regex_plus.test(obj.value)) {
obj.value =obj.value.replace(regex_plus, "");
alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
}
}
}
return obj.value = obj.value;
}

function searchUrlJuso(){
$("#resultData").hide();
var frm = document.AKCFrm;
frm.keyword.value = checkSearchedWord(frm.keyword); // 특수문자 및 sql예약어 제거, 20160912
$("#keyword").val(validateJuso($("#keyword").val())); //공백 및 특수문자 제거
if(!checkValidate1(frm.keyword, "검색어")) return;
else if(!checkValidate2(frm.keyword.value)) return;
$("#keyword").val(regExpCheckJuso($("#keyword").val()));
//우선정렬
if($("input:radio[name=raFirstSort]:checked").val() != undefined){
var firstSort = $("input:radio[name=raFirstSort]:checked").val();
$('#firstSort').val(firstSort);
}else{
$('#firstSort').val("none");
}
if( "Y" == "null" ){
$.ajax({
/* url :"https://www.juso.go.kr/addrlink/addrLinkApiJsonp.do"  //인터넷망 */
url :"https://business.juso.go.kr/addrlink/addrLinkApiJsonp.do"  //인터넷망
,type:"post"
,data:$("#AKCFrm").serialize()
,dataType:"jsonp"
,crossDomain:true
,success:function(xmlStr){
if(navigator.appName.indexOf("Microsoft") > -1){
var xmlData = new ActiveXObject("Microsoft.XMLDOM");
xmlData.loadXML(xmlStr.returnXml)
}else{
var xmlData = xmlStr.returnXml;
}
$(".popSearchNoResult").html("");
var errCode = $(xmlData).find("errorCode").text();
var errDesc = $(xmlData).find("errorMessage").text();
var totalCount = $(xmlData).find("totalCount").text();
var currentPage = $(xmlData).find("currentPage").text();
if( parseInt(totalCount) > 1000 && currentPage == "1" )
alert("검색 결과가 너무 많습니다(1,000건 이상)\n검색어 예를 참조하여 검색하시기 바랍니다.");
if(errCode != "0"){
alert(errDesc);
}else{
if(xmlStr != null){
makeList(xmlData);
}
}
}
    ,error: function(xhr,status, error){
    //alert("에러발생");
    alert("검색에 실패하였습니다 \n 다시 검색하시기 바랍니다.");
    }
});
}else{
$("#AKCFrm").attr("action","/addrlink/addrLinkUrlSearch.do").submit();
}
}

2024년 1월 15일 월요일

프로젝트 진행 및 관리 항목

 

[전체]

01. 프로젝트 일정 (전체)

02. 요구사항 정리 (사업부 + 고객부 -> 기획)

03. 기능 정의서 (기획)

04. 요구사항 분석 및 기획 컨셉 (기획)

05. 화면 UI (기획)

06. 디자인 컨셉 및 벤치마킨 (디자인)

07. 디자인 주요화면 (디자인)

08. 설계분석 (기획, 개발)

09. 개발환경 및 공용 콘트롤 (개발)

10. DB설계 (개발)

11. 개발 산출물 (개발)

12. 컨텐츠 작성 및 등록 (전체)

13. QC (전체)

14. 기타 (업무 및 개발 툴 등)



[주요항목]

01. 프로젝트 관리 및 일정 (전체)

02. 요구사항 정리 (담당자 및 기획)

03. 화면 UI (기획)

04. 디자인 주요화면 (디자인)

05. DB 설계 (개발)

06. 컨텐츠 (전체)

07. QC (전체)



[자료]

* 예상 리스트 정리

* 프로젝트 리소스 산정

* 프로젝트 전체 세부 일정

* 리소스별 투여 기간(일정)

* 메뉴(기능)별 리소스 일정



2024년 1월 3일 수요일

javascript - input 태그 event

 

<input/> 이벤트 발생 순서

focus => keyDown => keyPress => input => keyUp => blur => change
( * keyDown 사용 권장)



<input/> 관련 이벤트들

focus : 요소가 포커스가 되고 커서가 발생하여 입력이 가능해졌을 때 발생하는 이벤트입니다. 이후 진행되는 인풋 관련 이벤트들이 발생하고 감지될 수 있는 시작점이 됩니다.

blur : 요소의 포커스가 해제되었을 때 발생하는 이벤트입니다.

change : focus가 발생하기 전의 원래 입력값과 비교하여 변화가 일어났을 경우 blur 이벤트 이후에 발생하는 이벤트입니다.

input : value 속성의 값이 바뀔 때마다 발생하는 이벤트입니다. 일반적으로 keyPress 직후에 value 속성이 바뀌면서 input 이벤트가 발생합니다. input 이벤트 객체의 data 프로퍼티는 value 속성에 가장 최근 추가된 한 글자를 가지고 있습니다.(영어의 경우 알파벳 한 글자, 한국어의 경우 초성/중성/종성으로 이루어진 한 글자)

keyDown : 키가 눌렸을 때 발생합니다. input 이벤트 전에 발생됩니다.

keyPress : 키가 눌렸을 때 발생하며, keyDown 이벤트 이후에 발생합니다. 한글 입력이나 기능키 입력시에는 발생하지 않습니다. MDN에서 찾아보면 deprecated 되었다고 나오니, input 이벤트 전에 입력을 제어하고 싶다면 keyDown 이벤트를 사용하는게 바람직해 보입니다.
keyDown과 여러모로 비슷한 특성을 가지지만 특정 키에는 발생하지 않는 등의 예기치 않은 동작으로 혼란을 줄 수 있는 이벤트가 아닐까 생각합니다.

keyUp : input 이벤트 발생 후 value가 업데이트 된 이후에 키보드에서 손을 떼면 발생하는 이벤트입니다. 당연하게도 키를 꾹 눌러서 입력을 반복하거나 할때는 발생하지 않습니다.


출처 : https://maxkim-j.github.io/posts/keyboard-input/



Html - 점검중 페이지 (예문)



<!DOCTYPE html>
<html lang="ko">
<head>
    <title>사이트 점검중</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta http-equiv="imagetoolbar" content="no" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/js/all.min.js"></script>
</head>
<body style="font-family: 'MS Gothic';">
    <div style="position:absolute;left:50%;top:50%;transform: translate(-50%, -50%);width: 587px;height: 488px;outline: solid 1px #D4D4D4;">
        <div style="width:100%;height:62px;vertical-align: middle;display: flex;">
            <div style="width:80%;margin-left:3%;float:left;font-size:30px;font-weight:600;margin-top: 10px;"><i class="fa-solid fa-circle-exclamation fa-bounce" style="color: #fe3f40;margin-right:5px;"></i>사이트 임시점검 안내</div>
            <div style="width:20%;margin-right:3%;float:left;font-size:18px;margin-top:20px;">미소몰닷컴</div>
        </div>
        <div style="width:94%;height:1px;margin-left:3%;border-bottom:1px dotted #D4D4D4;"></div>
        <div style="height:100px;margin-top:50px;width:94%;margin-left:3%;">
            <span style="justify-content:center;align-items:center;display:flex;">사이트입니다.</span>
            <span style="justify-content:center;align-items:center;display:flex;">보다 나은 서버스 제공을 위하여 홈페이지 이용이 제한됩니다.</span>
            <span style="justify-content:center;align-items:center;display:flex;">빠른 시간내에 정상 서비스가 가능하도록 노력하겠습니다.</span>
        </div>
        <div style="height:100px;width:94%;margin-left:3%;background-color:#F1F1F1;border-radius: 10px;">
            <span style="justify-content:center;align-items:center;display:flex;padding-top:25px;">
                일자 : 2023년 12월 28일 목요일<br />
                시간 : 18시 00분 ~ 20시 00분
            </span>
        </div>
        <div style="margin-top:50px;">
            <span style="font-size:20px;font-weight:bold;justify-content:center;align-items:center;display:flex;">양해부탁드립니다.</span>
            <span style="font-size:20px;font-weight:bold;justify-content:center;align-items:center;display:flex;">감사합니다.</span>
        </div>
    </div>
</body>
</html>
 

javascript - Notice rolling

 
        function rollingNotice() {
        var $element = $('#noticeList');
        var speed = 3000;
        var timer = setInterval(moveNextSlide, speed);
        var move = $element.children().outerHeight();
        var lastChild;
        lastChild = $element.children().eq(-1).clone(true);
        lastChild.prependTo($element);
        $element.children().eq(-1).remove();
        if($element.children().length==1) {
        $element.css('top','0px');
            }
            else {
        $element.css('top','-'+move+'px');
        }
        $element.find('>a').bind({
        'mouseenter': function(){
        clearInterval(timer);
        },
        'mouseleave': function(){
        timer = setInterval(moveNextSlide, speed);
        }
        });
        function moveNextSlide() {
        $element.each(function(idx){
        var firstChild = $element.children().filter(':first-child').clone(true);
        firstChild.appendTo($element);
        $element.children().filter(':first-child').remove();
        $element.css('top','0px');
        $element.animate({'top':'-'+move+'px'},'normal');
        });
        }
        }


                    <dl class="notice" style="position:relative;overflow:hidden;">
                        <dt><a href="" title="공지사항 바로가기" rel="nosublink">[공지사항]</a></dt>
                        <dd id="noticeList">
                                    <a href="" class="hiddenOverflow" style="display:block;width:200px;height:27px" rel="nosublink">item.TITLE</a>
                        </dd>
                    </dl>


dl.notice {float:left;padding-top:9px;width:325px;height:23px}
dl.notice dt {float:left;padding-right:6px;font-weight:bold;color:#ff4948}
dl.notice dt a {color:#ff4948;vertical-align:top}
dl.notice dd {float:left;padding-right:7px;font-size:12px}
dl.notice dd a {color:#444;vertical-align:top}


javascript - getUrlParams (object params)

 

    function getUrlParams() {
        var params = {};
        window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(str, key, value) { params[key] = value; });
        return params;
    }


        try {
            var oParams = getUrlParams();
            if (oParams.Gubun) {
                //changeViewGubun('C');
            }
            if (oParams.Name) {
                //$("#txtName").val(decodeURI(oParams.Name));
            }
        }
        catch (e) {
        }


jQuery - Datepicker

 
<script>
   $(function() {
       //input을 datepicker로 선언
       $("#datepicker").datepicker({
           dateFormat: 'yy-mm-dd' //달력 날짜 형태
           ,showOtherMonths: true //빈 공간에 현재월의 앞뒤월의 날짜를 표시
           ,showMonthAfterYear:true // 월- 년 순서가아닌 년도 - 월 순서
           ,changeYear: true //option값 년 선택 가능
           ,changeMonth: true //option값  월 선택 가능                
           ,showOn: "both" //button:버튼을 표시하고,버튼을 눌러야만 달력 표시 ^ both:버튼을 표시하고,버튼을 누르거나 input을 클릭하면 달력 표시  
           ,buttonImage: "http://jqueryui.com/resources/demos/datepicker/images/calendar.gif" //버튼 이미지 경로
           ,buttonImageOnly: true //버튼 이미지만 깔끔하게 보이게함
           ,buttonText: "선택" //버튼 호버 텍스트              
           ,yearSuffix: "년" //달력의 년도 부분 뒤 텍스트
           ,monthNamesShort: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'] //달력의 월 부분 텍스트
           ,monthNames: ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'] //달력의 월 부분 Tooltip
           ,dayNamesMin: ['일','월','화','수','목','금','토'] //달력의 요일 텍스트
           ,dayNames: ['일요일','월요일','화요일','수요일','목요일','금요일','토요일'] //달력의 요일 Tooltip
           ,minDate: "-5Y" //최소 선택일자(-1D:하루전, -1M:한달전, -1Y:일년전)
           ,maxDate: "+5y" //최대 선택일자(+1D:하루후, -1M:한달후, -1Y:일년후)  
       });                    
       
       //초기값을 오늘 날짜로 설정해줘야 합니다.
       $('#datepicker').datepicker('setDate', 'today'); //(-1D:하루전, -1M:한달전, -1Y:일년전), (+1D:하루후, -1M:한달후, -1Y:일년후)            
   });
</script>





function setDatePicker() {
    $.datepicker.regional['ko'] = {
        changeMonth: true,
        changeYear: true,
        closeText: '닫기',
        prevText: '이전달',
        nextText: '다음달',
        currentText: '오늘',
        monthNames: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
        monthNamesShort: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],
        dayNames: ['일', '월', '화', '수', '목', '금', '토'],
        dayNamesShort: ['일', '월', '화', '수', '목', '금', '토'],
        dayNamesMin: ['일', '월', '화', '수', '목', '금', '토'],
        weekHeader: 'Wk',
        dateFormat: 'yy-mm-dd',
        firstDay: 0,
        isRTL: false,
        duration: 200,
        showAnim: 'show',
        showMonthAfterYear: true,
        inline: true,
        showOn: 'both',
        buttonImage: "/images/wos/btn_calendar.gif",
        buttonImageOnly: true
    };

    $.datepicker.setDefaults($.datepicker.regional['ko']);
};


    $(document).on("ready", function () {
        setDatePicker();
        $('#txtStartDate, #txtEndDate').datepicker().datepicker('setDate', new Date());
    });





MSSQL - Cursor vs Temp Table

#테이블 변수사용의 예 use pubs go declare @tmptable table (     nid int identity(1,1) not null,     title varchar (80) not null ) -- 테이블 변수 선언 inse...