2020년 3월 31일 화요일

[다독프로젝트 +91] 존리의 부자되기 습관


존리의 부자되기 습관 - 10점
존 리 지음/지식노마드

제목: 존리의 부자되기 습관
저자: 존 리
출판사: 지식노마드
장르: 경제경영


알 수 없는 유튜브의 알고리즘이 나를 이곳으로 이끌었다.
주식투자를 야금야금 하고 있는 내가 마음가짐을 가질 수 있도록 도움을 준 책이다.
김광진의 지키는투자 이후 옆에 두고 읽으면 좋을 책이라고 생각 했다.
주식 투자를 시작하면서 나름 매매의 원칙을 두고 있었는데...
완전 잘못 생각 하고 있었다.
주식은 팔려고 사는게 아니다. 그럼 돈을 어떻게 벌어? 라는 생각을 했는데 읽다보니 설득됐다.
그렇다고 무조건적으로 팔지말라는 식은 아니었다.

p.131
특별한 매도 요인이 없다면 계속해서 투자해야한다. 특별한 매도 요인이란 예를 들어 경영진이 비도덕적으로 변질되었다거나, 주가가 기업의 실제 가치보다 훨씬 높은 가격대까지 이유없이 폭등한다거나, 시대와 기술의 변화로 제품이 소용없어지는 등 기업 자체의 상황이 바뀌는 경우를 말한다.

마음을 다잡는다. 그리고 내가 가진 주식을 다시 점검한다.
그리고 계속 공부해야한다. 

이 책을 다 읽고 메리츠증권에 펀드를 가입했다. 매일 5,000원씩 투자하는 것!(주말에는 인출되지 않는다.)
당장 팔 생각으로 투자하는 것이 아닌 나중에 내가 은퇴할 때 유용하게 쓸 수 있길 기대한다.



2020년 3월 27일 금요일

[VBA] EncodeURL function


VBA에서 API를 호출해서 데이터를 가지고 오는데 URL에 특수문자 혹은 한글이 있는 경우 글자가 깨져서 데이터를 못가져온다.

Excel Version: 2013 이상

해결방법
EncodeURL 함수를 활용해서 넘겨주는 데이터를 URL이 읽을 수 있도록 인코딩을 한다.

Dim varEncodeURL As Varint
Dim var1 As String
var1 = "대한 민국"
varEncodeURL = WorksheetFunction.EncodeURL(var1)

varEncodeURL 변수를 URL 주소에 붙이면 정상적으로 데이터를 불러온다.

관련링크

사소하지만 이 문제로 데이터를 못 불러와서 한참동안 찾았다....
다른 사람들은 헤메지 않았으면 하는 바람 및 내 기억력을 믿지 못해 기록으로 남긴다.



2020년 3월 26일 목요일

[VBA] Excel Formula vlookup


요즘 VBA 공부하고 있는데 이것 저것 에러 해결 방법을 적어 둔다.

문제: VBA에서 ActiveCell.FormulaR1C1 을 활용해서 VLOOKUP을 사용하고 있는데
VLOOKUP에서 Lookupvalue 문자열에 ~을 인식 하지 못함

기존 식

ActiveCell.FormulaR1C1 = "=VLOOKUP([@상품명],Sales[[상품]:[타입]],3,FALSE)"

상품명에 ~ 문자열인식못해서 Substitute 함수를 이용해 변경 하려고함

변경 중 (에러남)

ActiveCell.FormulaR1C1 = "=VLOOKUP(SUBSTITUTE([@상품명],"~",""),Sales[[상품]:[타입]],3,FALSE)"

이것도 안됨 왜냐하면  " 문자열 때문에 VBA에서 받아주지 않음

변경 (정상작동)

ActiveCell.FormulaR1C1 = "=VLOOKUP(SUBSTITUTE([@상품명]," & Chr(34) & "~" & Chr(34) & "," & Chr(34) & "~~" & Chr(34) & "),Sales[[상품]:[타입]],3,FALSE)"

" 문자는 Chr(34)로 변경
"~"는 "~~" 로 변경해야 적용 가능하다.

참고 링크

정상 작동 확인



2020년 3월 24일 화요일

[SSRS] Error: An error occurred during local report processing

SSRS version :  14.0.600.744

오류: SSRS 사이트에서는 잘 열리지만 로컬에서 확인 하는데 "An error occurred during local report processing" 과 같은 메시지가 뜬다면?

난감하다. 사이트는 잘 열리는데 왜 로컬에서만 열리지 않는가?


다양한 이유가 있겠지만...
Report의 Data Sources를 체크할 필요가 있다.

Report 파일 *.rdl 열기 -> Report Data 메뉴 > Data Sources 폴더 > DB 정보 리스트

간혹 DB의 값이 변경되어 해당 DB 연결정보가 바뀐 경우다. (사실 극히 드물다. 그래서 원인 찾기도 쉽지 않았다!)

해당 DataSource의 연결을 확인하고 DataSets을 불러오니 정상적으로 확인 됐다.

너무 간단해서 팁으로 올리기도 민망함!



2020년 3월 12일 목요일

[SSRS] Report Datasets list Query


SSRS 작업을 하다보면 레포트가 어떤 데이터 셋을 사용하고 있는지 궁금할 때가 있다.
레포트를 열어서 확인하면 되지만.. 열어야 하는 레포트가 많다면??
정말 난감하다.

그래서 찾아봤음. 역시 스택오버플로우는 알고 있다.

링크 참조

쿼리는 아래와 같다.

-- Provided "as is" with no warranties of any kind. User assumes all risks of use.
/* The XML XQuery statements used below ignore namespace so that information can be retrieved
   from multiple RDL versions. */
use ReportServer
;WITH CatalogWithXml AS (
    -- XMLifyies Catalog's Content column.
    /* For report (Type = 2) and shared data source (Type = 5) objects, the image-typed column
       Content stores the XML RDL defining the object. We convert this column to XML so that SQL's
       XML type's functions can be used on it. */
    SELECT *,
         ContentXml = (CONVERT(XML, CONVERT(VARBINARY(MAX), Content)))
    FROM Catalog
),
 
SharedDataSources AS (
    -- Details on uses of shared data sources.
    -- * Unused data sources are ignored.
    -- * ItemID identifies the catalog entry (e.g. report) using the shared data source. It is not
    --   the data source's ID!
    /* Table DataSource contains a row for each data source (embedded or shared) used in each report.
       Its column Name stores the data source name, as defined in the report. Shared data sources are
       defined (RDL XML) in the catalog. Inner joining between these two tables limits this CTE's
       resultset to details on shared data sources because embedded data sources don't have Link-ed
       rows in the catalog. */
    SELECT ds.ItemID,
        SharedDataSourceName = c.Name,
        LocalDataSourceName = ds.Name,
        DataProvider = ContentXML.value('(/*:DataSourceDefinition/*:Extension)[1]''NVARCHAR(260)'),
        ConnectionString = ContentXML.value('(/*:DataSourceDefinition/*:ConnectString)[1]''NVARCHAR(MAX)')
    -- Each DataSource row with a Link value represents a use of a shared data source.
    FROM DataSource ds
        -- Uses the Link value to look up the catalog entry defining the shared data source.
        JOIN CatalogWithXml c ON ds.Link = c.ItemID
),
 
AllDataSources AS (
    -- Details on both embedded & shared data sources *used* by reports.
    /* Embedded data sources are defined in the hosting report's RDL. Shared data sources are
       referenced (but not defined) in this RDL. We extract the relevant details and then join
       to the SharedDataSources CTE to assemble a resultset with details on each data source
       (embedded and shared) used by each report (identified by ItemID). */
    SELECT r.ItemID,
        r.LocalDataSourceName, -- embedded data source's name or local name given to shared data source
        sds.SharedDataSourceName,
        SharedDataSource = CAST ((CASE WHEN sds.SharedDataSourceName IS NOT NULL THEN 1 ELSE 0 END) AS BIT),
        DataProvider = ISNULL(r.DataProvider, sds.DataProvider),
        ConnectionString = ISNULL(r.ConnectionString, sds.ConnectionString)
    FROM (
        SELECT c.*,
                LocalDataSourceName = DataSourceXml.value('@Name''NVARCHAR(260)'),
                DataProvider = DataSourceXml.value('(*:ConnectionProperties/*:DataProvider)[1]''NVARCHAR(260)'),
                ConnectionString = DataSourceXml.value('(*:ConnectionProperties/*:ConnectString)[1]''NVARCHAR(MAX)')
            FROM CatalogWithXml c
                CROSS APPLY ContentXml.nodes('/*:Report/*:DataSources/*:DataSource') DataSource(DataSourceXml)
            WHERE c.Type = 2 -- limit to reports only
        ) r
        LEFT JOIN SharedDataSources sds ON r.ItemID = sds.ItemID AND r.LocalDataSourceName = sds.LocalDataSourceName
),
 
DataSets AS (
    -- Details on data sets used in reports.
    /* Outputs one row per data set used in each report. */
    SELECT ItemID,
        DataSetName = QueryXml.value('@Name''NVARCHAR(256)'),
        DataSourceName = QueryXml.value('(*:Query/*:DataSourceName)[1]''NVARCHAR(260)'),
        CommandType = QueryXml.value('(*:Query/*:CommandType)[1]''NVARCHAR(15)'),
        CommandText = QueryXml.value('(*:Query/*:CommandText)[1]''NVARCHAR(MAX)')
    FROM CatalogWithXml
        CROSS APPLY ContentXml.nodes('/*:Report/*:DataSets/*:DataSet') QueryData(QueryXml)
),
 
Data AS (
    -- Combines data set and data source details with additional information from Catalog.
    SELECT ds.ItemID,
        Name,
        Path,  
        LocalDataSourceName,
        SharedDataSource,
        SharedDataSourceName,
        DataProvider,
        ConnectionString,
        DataSetName,
        CommandType = ISNULL(CommandType, 'Text'), -- "Text" = default command type
        CommandText
    FROM DataSets ds
        JOIN AllDataSources src ON src.ItemID = ds.ItemID AND src.LocalDataSourceName = ds.DataSourceName
        JOIN Catalog c ON ds.ItemID = c.ItemID
)
SELECT * FROM Data

아주 유용하게 사용할 것 같다.